SYSTEM RESOURCE EXCEEDED

GGERMINIANI 09/06/2017 16:58:46
#474426
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.


  
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!!!
KERPLUNK 09/06/2017 17:46:49
#474429
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
GGERMINIANI 19/06/2017 17:17:17
#474610
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:

  
_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