Inquiridor
GRAVAR DATATABLE DE OUTRA FONTE DE DADOS - EM UM BANCO DE DADOS FIREBIRD

Pergunta
-
Pessoal,
Estou obtendo um DataTable de um arquivo de texto de largura fixa, da seguinte forma :
'Essa sub tem como objetivo inserir o arquivo importado para o banco de dados Public Sub IMPORTA() '************************************************************************************************************************ Dim arquivo As String = "E:\arquivo.txt" '************************************************************************************************************************ Dim R50 As Boolean = False '************************************************************************************************************************ Dim DTableR50 As New DataTable("DTableR50") '************************************************************************************************************************ Dim STRING_R50() As String = ("TIPO|CNPJ|INSC_ESTADUAL").Split("|") '************************************************************************************************************************ Dim QtdeR50 As Integer = STRING_R50.Length '************************************************************************************************************************ Dim sAry50(QtdeR50) As String '************************************************************************************************************************ For Each Coluna As String In STRING_R50 DTableR50.Columns.Add(Coluna.Trim, GetType(String)) Next '************************************************************************************************************************ Dim OrigemColunas() = My.Computer.FileSystem.ReadAllText(arquivo).Split(vbCrLf.ToCharArray, _ System.StringSplitOptions.RemoveEmptyEntries) 'Cria um dataset que receberá o datatable Dim DataSet1 As DataSet = New DataSet 'Abre a conexão com o banco de dados cn.Open() 'Variável que receberá a string do Arquivo que será lido. Dim sFilename As String = arquivo Dim myStream As System.IO.StreamReader = New System.IO.StreamReader(sFilename) Dim line As String Dim RowField As DataRow 'Loop que preenche o Datatable 'Esse loop percorre todo o arquivo e verifica se a linha começa com o o valor procurado, ex.: 50 Do 'Lê o arquivo de texto linha por linha... line = myStream.ReadLine() 'Se a linha for vazia encerra o laço If line Is Nothing Then 'Sai do laço DO Exit Do Else If line.StartsWith("50") Then R50 = True If R50 = True Then 'Obtém os valores dos campos que formarão a nova linha '...Como o arquivo é de largura fixa, ou seja, não possui delimitador, Ex.: "|", ou ","... '...os valores são obtidos através do posicionamento da string na corrente linha, usando o método SUBSTRING. sAry50(0) = line.Substring(0, 2) 'Tipo sAry50(1) = line.Substring(2, 14) 'CNPJ sAry50(2) = line.Substring(16, 14) 'Inscrição Estadual 'Aqui a rotina que estou usando atualmente para inserir no banco '*****************(INSERE NO BANCO DE DADOS)********************** Dim INSERT_R50 As String = "INSERT INTO REGISTRO_50 (TIPO, CNPJ, INSC_ESTADUAL) VALUES ('" & sAry50(0) & "', '" & sAry50(1) & "', '" & sAry50(2) & "'" & ")" Try Dim cmd As New FbCommand(INSERT_R50, cn) cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message.ToString) Finally End Try '******************************************************************************* 'Monta a nova linha com a estrutura definida RowField = DTableR50.NewRow For i As Integer = 0 To STRING_R50.Length - 1 RowField(i) = sAry50(i) Next 'Adiciona a nova linha ao DataTable DTableR50.Rows.Add(RowField) End If End If End If Loop 'Fecha o streamreader myStream.Close() cn.Close() 'Adiciona os DataTables ao DataSet1 DataSet1.Tables.Add(DTableR50) End Sub
Até aí tudo bem, consigo obter o DataTable sem problemas, porém, gostaria de gravar esse datatable em uma tabela já existente do meu banco de dados.
Eu estou conseguindo fazer isso usando a parte do código que está comentada :
'*****************(INSERE NO BANCO DE DADOS)**********************
Só que dependendo da quantidade de registros (20.000, por exemplo), está muito lenta a rotina.
Talvez se eu fizesse um COMMIT quando atingisse uma determinada quantidade de registros, tipo 1.000, resolveria, porém, acredito que exista uma forma mais eficiente de fazer o que desejo e gravar toda a minha tabela no Banco.
Desde já muito obrigado.
- Editado Geraldo Ribeiro domingo, 13 de outubro de 2013 21:11