Jump to content
Sign in to follow this  
Seabra

Erro no ciclo leitura base de dados

Recommended Posts

Seabra

Boas,

O código abaixo dá o erro:

A first chance exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: System resource exceeded.

Este erro aparece na linha "cmd1.ExecuteReader()" e só depois de percorrer o ficheiro

e já no ciclo Loop ao ler a linha 427 ou na linha 428 ou na linha 426 do ficheiro de texto que está a ler, é que dá o erro. Ou seja funciona tudo até 427 volta do loop e não é sempre na mesma posição do loop.

Já reduzi i ficheiro de texto para verificar se havia problema com as linhas de texto, mas está tudo bem.

Já me fartei de dar voltas à cabeça e não decubro Alguém me pode ajudar?

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    Dim ConStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & My.Settings.Base_Dados & " ;Persist Security Info=False;"
    Dim Conn1 = New OleDb.OleDbConnection(ConStr)
    Dim file As String = "c:\18.txt"
    Dim Linha As String
    Dim Array_Dados() As String
    Dim Data_Txt As String
    Dim Data As Date
    Dim cmd As New OleDb.OleDbCommand
    Dim cmd1 As New OleDb.OleDbCommand
    Conn1.Open()

    If System.IO.File.Exists(file) = True Then
        Dim objReader As New System.IO.StreamReader(file)
        Do While objReader.Peek() <> -1
            Linha = objReader.ReadLine() & vbNewLine
            Array_Dados = Linha.Split(";")
            Data_Txt = DateTime.Parse(Array_Dados(0) & " " & Array_Dados(1))
            Data = Convert.ToDateTime(Data_Txt)

            cmd1 = Conn1.CreateCommand
            cmd1.CommandText = "SELECT DataHora FROM Registos WHERE DataHora =@Campo1"
            cmd1.Parameters.AddWithValue("@Campo1", SqlDbType.DateTime).Value = Data
            cmd1.ExecuteReader()
            Application.DoEvents()
        Loop
    End If
End Sub
End Class

cumprimentos

Share this post


Link to post
Share on other sites
FreiNando

O erro deve acontecer quando a data não é valida. O Access não aceita datas anteriores a 01-01-0100.

Qual é o objectivo do teu procedimento?

DateTime.Parse() faz quase o mesmo que Convert.ToDateTime(), e já devolve um valor DateTime, não precisa converter novamente.

SELECT Devolve um resultado que pode ser lido com um OleDbDataReader = cmd1.ExecuteReader(). Não vejo onde queres chegar.

E para que é o primeiro cmd?

Edited by FreiNando

O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
Seabra

O erro deve acontecer quando a data não é valida. O Access não aceita datas anteriores a 01-01-0100.

Qual é o objectivo do teu procedimento?

DateTime.Parse() faz quase o mesmo que Convert.ToDateTime(), e já devolve um valor DateTime, não precisa converter novamente.

SELECT Devolve um resultado que pode ser lido com um OleDbDataReader = cmd1.ExecuteReader(). Não vejo onde queres chegar.

E para que é o primeiro cmd?

Olá

Estou a utilizar os dois comandos porque a data vem separada da hora e tenho que os juntar. Por outro lado se eu colocar NOW à frente do Parametro "cmd1.Parameters.AddWithValue("@Campo1", SqlDbType.DateTime).Value = Now"

dá erro de parâmetro inválido. Por isso utilizo os dois comandos juntos.

Com o código pretendo saber se já existe aquela data que vem do ficheiro de texto, na base de dados, e se não existe vai gravar. O código que grava, fica mais a baixo e utiliza o cmd.

Se poderes ajudar a organizar o código agradeço.

Cumprimentos

Share this post


Link to post
Share on other sites
FreiNando

Mas Data = DateTime.Parse(Array_Dados(0) & " " & Array_Dados(1)) não é suficiente?

O cmd1.Parameters.AddWithValue("@Campo1", SqlDbType.DateTime).Value = Data não é a forma correta.

Usa cmd1.Parameters.AddWithValue("@Campo1", Data)

Ou cmd1.Parameters.Add("@Campo1", OleDbType.Date).Value = Data

E para saber se o registo existe:

Dim rd as OleDbDataReader=cmd1.ExecuteReader()

If rd.HasRows then

'Existe! Pode fazer um UPDATE para receber Novos Valores

Else

'Não Existe! Faz um INSERT para receber os novos valores

End If

rd.Close ' Importante fechar o DataReader

Edited by FreiNando

O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
Seabra

Mas Data = DateTime.Parse(Array_Dados(0) & " " & Array_Dados(1)) não é suficiente?

O cmd1.Parameters.AddWithValue("@Campo1", SqlDbType.DateTime).Value = Data não é a forma correta.

Usa cmd1.Parameters.AddWithValue("@Campo1", Data)

Ou cmd1.Parameters.Add("@Campo1", OleDbType.Date).Value = Data

E para saber se o registo existe:

Dim rd as OleDbDataReader=cmd1.ExecuteReader()

If rd.HasRows then

'Existe! Pode fazer um UPDATE para receber Novos Valores

Else

'Não Existe! Faz um INSERT para receber os novos valores

End If

rd.Close ' Importante fechar o DataReader

Com o teu método funciona. Tenho sempre que fazer "RD. close", caso contrário dá o mesmo erro.

Obrigado pela ajuda

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.