SYSTEM RESOURCE EXCEEDED
Pessoal,
Boa tarde.
Estou com um problemão ao importar arquivos .CSV.
Resumidamente, eu seleciono vários arquivos CSV e dentro destes exitem vários registros para importar para meu BD.
Dentro dos meus testes, quando vou debugando os comandos, entendi que o problema está em criar várias vezes a variável comm = New OleDbCommand(_query, _cn).
Como está dentro de um loop e são mais de 5.000,00 registros, os primeiros 2 mil vão, depois vem a mensagem: [Ô]System Resource Exceeded[Ô].
Abaixo, posto o código para avaliarem.
Alguém teria um outro método?
Cheers!!!
Boa tarde.
Estou com um problemão ao importar arquivos .CSV.
Resumidamente, eu seleciono vários arquivos CSV e dentro destes exitem vários registros para importar para meu BD.
Dentro dos meus testes, quando vou debugando os comandos, entendi que o problema está em criar várias vezes a variável comm = New OleDbCommand(_query, _cn).
Como está dentro de um loop e são mais de 5.000,00 registros, os primeiros 2 mil vão, depois vem a mensagem: [Ô]System Resource Exceeded[Ô].
Abaixo, posto o código para avaliarem.
Public Shared Function _ValidaGetnetMV(arquivo As String) As Integer
Try
Dim linhaTexto As String = [Ô][Ô]
Dim arrrayDeLinhas() As String
Dim nomeArquivo As String = [Ô][Ô]
Dim PulaCabecalho As Boolean = False
Dim comm As New OleDbCommand
If File.Exists(arquivo) = True Then
Dim ci1 As New CultureInfo([Ô]pt-BR[Ô])
Dim objReader As New StreamReader(arquivo, Encoding.GetEncoding(ci1.TextInfo.ANSICodePage))
[ô]percorre o arquivo
Do While objReader.Peek() <> -1
linhaTexto = objReader.ReadLine()
arrrayDeLinhas = Split(linhaTexto, [Ô];[Ô])
If PulaCabecalho = False Then
If arrrayDeLinhas.Length = 11 Then
If arrrayDeLinhas(0).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Produto[Ô] Or arrrayDeLinhas(1).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Dt. Lançamento em c/c[Ô] Or arrrayDeLinhas(2).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Vl. Bruto(RV)[Ô] Or arrrayDeLinhas(3).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Vl. LÃquido(RV)[Ô] Or arrrayDeLinhas(4).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Dt. Transação[Ô] Or arrrayDeLinhas(5).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Hr. Transação[Ô] Or arrrayDeLinhas(6).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]N° CV[Ô] Or arrrayDeLinhas(7).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]N° Autorização[Ô] Or arrrayDeLinhas(8).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Vl. Total Transação(R$)[Ô] Or arrrayDeLinhas(9).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) <> [Ô]Parceria[Ô] Then
Return 3
Else
PulaCabecalho = True
Continue Do
End If
Else
Return 3
End If
End If
If arrrayDeLinhas.Length = 11 Then
If arrrayDeLinhas(2).Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper = String.Empty Or arrrayDeLinhas(3).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper = String.Empty Or arrrayDeLinhas(4).Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper = String.Empty Then
Continue Do
ElseIf arrrayDeLinhas(2).Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper < 0 Or arrrayDeLinhas(3).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper < 0 Then
Continue Do
End If
g_Produto = arrrayDeLinhas(0).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper
g_Data_Lanc = Format(Convert.ToDateTime(arrrayDeLinhas(1).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô])))
g_ValorBruto = arrrayDeLinhas(2).Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper
g_ValorLiquido = arrrayDeLinhas(3).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper
g_Data = Convert.ToDateTime(arrrayDeLinhas(4).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]) & [Ô] [Ô] & arrrayDeLinhas(5).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]))
g_CV = arrrayDeLinhas(6).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô])
g_Autorizacao = arrrayDeLinhas(7).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô])
g_ValorTotal = arrrayDeLinhas(8).ToString.Replace([Ô][Ô][Ô][Ô], [Ô][Ô]).Trim.ToUpper
Else
Continue Do
End If
Dim CV As Integer = Convert.ToInt32(g_CV)
_query = [Ô]Select * From GETNET_MV where AUTORIZACAO = @auto and CV = @acv[Ô]
comm = New OleDbCommand(_query, _cn)
comm.CommandType = CommandType.Text
comm.Parameters.AddWithValue([Ô]@auto[Ô], g_Autorizacao)
comm.Parameters.AddWithValue([Ô]@acv[Ô], CV)
Dim leitor = comm.ExecuteReader
leitor.Read()
If leitor.HasRows Then
Continue Do
Else
_query = [Ô]Insert into GETNET_MV (DATA, PRODUTO, DATA_LANC, AUTORIZACAO, CV, BRUTO, LIQUIDO, VALOR, DT_CAD) values (@data, @prod, @datalanc, @auto, @acv, @bruto, @liquido, @valor, @dtcad)[Ô]
Dim BRUTO As Decimal
If g_ValorBruto <> [Ô][Ô] Then
BRUTO = Convert.ToDecimal(g_ValorBruto.ToString)
End If
Dim TOTAL As Decimal
If g_ValorTotal <> [Ô][Ô] Then
TOTAL = Convert.ToDecimal(g_ValorTotal.ToString)
End If
Dim DATALANC As DateTime
If g_Data_Lanc <> [Ô][Ô] Then
DATALANC = Convert.ToDateTime(g_Data_Lanc.ToString)
End If
Dim LIQUIDO As Decimal
If g_ValorLiquido <> [Ô][Ô] Then
LIQUIDO = Convert.ToDecimal(g_ValorLiquido.ToString)
End If
Dim DATA As DateTime
If g_Data <> [Ô][Ô] Then
DATA = Convert.ToDateTime(g_Data.ToString)
End If
comm = New OleDbCommand(_query, _cn)
comm.CommandType = CommandType.Text
comm.Parameters.AddWithValue([Ô]@data[Ô], DATA)
comm.Parameters.AddWithValue([Ô]@prod[Ô], g_Produto)
comm.Parameters.AddWithValue([Ô]@datalanc[Ô], DATALANC)
comm.Parameters.AddWithValue([Ô]@auto[Ô], g_Autorizacao)
comm.Parameters.AddWithValue([Ô]@acv[Ô], CV)
comm.Parameters.AddWithValue([Ô]@bruto[Ô], BRUTO.ToString([Ô]#,##0.000000[Ô]))
comm.Parameters.AddWithValue([Ô]@liquido[Ô], LIQUIDO.ToString([Ô]#,##0.000000[Ô]))
comm.Parameters.AddWithValue([Ô]@valor[Ô], TOTAL.ToString([Ô]#,##0.000000[Ô]))
comm.Parameters.AddWithValue([Ô]@dtcad[Ô], FormatDateTime(Now, DateFormat.GeneralDate))
comm.ExecuteNonQuery()
End If
Loop
Else
Return 0
End If
Return 1
Catch ex As Exception
MessageBox.Show(ex.Message, [Ô]Alerta de Erro[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
Return 2
End Try
End Function
Alguém teria um outro método?
Cheers!!!
Você pode abrir os arquivos CSV como bancos de dados mesmo, e não como simples arquivos texto, que é o que você está fazendo. A string de conexão, juntamente com algumas instruções, você encontra aqui
Prezados,
Boa tarde.
Para encerrar o tópico, a solução que encontrei foi a seguinte:
A cada chamada de um OleDBCommand, fechei e abri o banco de dados para passar as novas instruções.
Ficou da seguinte forma:
Sendo que, Call conState():
Com isso, o erro parou de acontecer para gravar os registros importados de um CSV.
Grato.
Boa tarde.
Para encerrar o tópico, a solução que encontrei foi a seguinte:
A cada chamada de um OleDBCommand, fechei e abri o banco de dados para passar as novas instruções.
Ficou da seguinte forma:
_cn.Close()
Call conState()
Dim comm As OleDbCommand = New OleDbCommand(_query, _cn)
comm = New OleDbCommand(_query, _cn)
comm.CommandType = CommandType.Text
comm.Parameters.AddWithValue([Ô]@auto[Ô], g_Autorizacao)
comm.Parameters.AddWithValue([Ô]@acv[Ô], cv)
Dim leitor = comm.ExecuteReader
leitor.Read()
Sendo que, Call conState():
Public Shared Sub conState()
If _cn.State = ConnectionState.Closed Then
_cn.Open()
End If
End Sub
Com isso, o erro parou de acontecer para gravar os registros importados de um CSV.
Grato.
Tópico encerrado , respostas não são mais permitidas