IMPORTACAO DEMORA MUITO!!!!

BARTSIMONS 20/05/2013 13:51:50
#423761
Boa tarde!!!

Consigo importar uma planilha do Excel para o Access via código vb, mas essa importação demora muito,
em uma planilha com 300.000 linhas o sistema importa cerca de 3.000 linhas por minuto, eu precisava que
essa importação fosse mais rápida, alguém sabe como?

Grato.
KERPLUNK 20/05/2013 14:34:55
#423766
Você está inserindo os registros um a um?
Você está usando concatenação de query?

Se sim para as duas perguntas, concatene em lotes de 1000 em 1000 registros separando os comandos de insert por [Ô];[Ô] e execute-os.
BARTSIMONS 20/05/2013 16:00:24
#423771
Citação:

:
Você está inserindo os registros um a um?
Você está usando concatenação de query?

Se sim para as duas perguntas, concatene em lotes de 1000 em 1000 registros separando os comandos de insert por [Ô];[Ô] e execute-os.



KERPLUNK,
Estou iniciando agora em VB, não sei como concatenar os registros de 1000 em 1000, segue abaixo o código que uso para fazer essa importação.

Dim oc As New System.Data.OleDb.OleDbConnection
Dim cmd As New OleDbCommand
oc.ConnectionString = [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source= [Ô] & nomebanco & [Ô][Ô]
oc.Open()
Dim salvar As Boolean
cmd.Connection = oc
Dim str1 As String = [Ô][Ô] [ô]carrega coluna tipo
Dim str2 As String = [Ô][Ô] [ô]carrega coluna titulo
Dim str3 As String = [Ô][Ô] [ô]carrega coluna logradouro
Dim str4 As String = [Ô][Ô] [ô]carrega coluna numero
Dim str5 As String = [Ô][Ô] [ô]carrega coluna complementoquadra
Dim str6 As String = [Ô][Ô] [ô]carrega coluna numcomplementoquadra
Dim str7 As String = [Ô][Ô] [ô]carrega coluna bairro
Dim str8 As String = [Ô][Ô] [ô]carrega coluna cep

Dim lastrow As Long
Dim i As Integer
Dim xl As New Excel.Application
Dim xlw As Excel.Workbook
xlw = xl.Workbooks.Open(excel)
Dim aba As String = [Ô][Ô]
For a = 1 To xlw.Worksheets.Count
aba = xlw.Sheets(a).name
xlw.Sheets(aba).select()
[ô]variavel = xlw.application.range(TIPO).value
[ô]ListBox1.Items.Add(xlw.Application.Columns([Ô]A[Ô]).Value)
lastrow = xlw.Application.Range([Ô]A650000[Ô]).End(XlDirection.xlUp).Row
For i = 2 To lastrow
[ô]ListBox1.Items.Add(xlw.Application.Range([Ô]A[Ô] & i)).ToString()
str1 = (xlw.Application.Range([Ô]A[Ô] & i).Value) [ô]carrega coluna tipo
str2 = (xlw.Application.Range([Ô]B[Ô] & i).Value) [ô]carrega coluna titulo
str3 = (xlw.Application.Range([Ô]C[Ô] & i).Value) [ô]carrega coluna logradouro
str4 = (xlw.Application.Range([Ô]D[Ô] & i).Value) [ô]carrega coluna numero
str5 = (xlw.Application.Range([Ô]E[Ô] & i).Value) [ô]carrega coluna complementoquadra
str6 = (xlw.Application.Range([Ô]F[Ô] & i).Value) [ô]carrega coluna numcomplementoquadra
str7 = (xlw.Application.Range([Ô]I[Ô] & i).Value) [ô]carrega coluna bairro
str8 = (xlw.Application.Range([Ô]K[Ô] & i).Value) [ô]carrega coluna cep

Dim logradouro As String = str1 + [Ô] [Ô] + str2 + [Ô] [Ô] + str3
Dim newlog As String = Replace(logradouro, [Ô] [Ô], [Ô] [Ô])

cmd.CommandType = CommandType.Text
cmd.CommandText = [Ô]Insert Into IBGEDADOS(FONTEDADOS, CODIGO_IBGE, CODLOG, LOGRADOURO, NUM_LOGRADOURO, BAIRRO, CEP_DIREITO, CEP_ESQUERDO, NUM_QUADRA, LINK) values (@fontedados, @codigoibge, @codlog, @logradouro, @numlogradouro, @bairro, @cepdireito, @cepesquerdo, @numquadra, @link)[Ô]

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@fontedados[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@fontedados[Ô]).Value = [Ô]ibge[Ô]

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@codigoibge[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@codigoibge[Ô]).Value = [Ô]-[Ô]

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@codlog[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@codlog[Ô]).Value = [Ô]-[Ô]

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@logradouro[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@logradouro[Ô]).Value = newlog

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@numlogradouro[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@numlogradouro[Ô]).Value = str4

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@bairro[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@bairro[Ô]).Value = str7

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@cepdireito[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@cepdireito[Ô]).Value = str8

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@cepesquerdo[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@cepesquerdo[Ô]).Value = str8

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@numquadra[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@numquadra[Ô]).Value = [Ô];Q [Ô] + str6

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@link[Ô], OleDbType.VarChar))
cmd.Parameters([Ô]@link[Ô]).Value = [Ô]0[Ô]

Try
salvar = cmd.ExecuteNonQuery
cmd = New OleDbCommand(cmd.CommandText, oc)
Catch ex As Exception
MsgBox(ex.Message)
Finally
End Try
Next
Next
xlw.Close()
oc.Close()

Grato.
FELLIPEASSIS 20/05/2013 21:29:00
#423783
a vantagem de utilizar um SGBD e ñ um GA seria usar procedures e não querys nas app
tem um topico sobre isso aqui
BARTSIMONS 21/05/2013 11:03:34
#423800
Citação:

:
Essa semana eu precisei fazer isso eu fiz assim:

converti o arquivo xls para csv e importei no banco de dados (no meu caso foi PostgreSql) e foi bem rápido(Tenho muito registro no arquivo!

Dim excelSheetToOpen As New OpenFileDialog()
Dim definicao As String = [Ô]Data1[Ô]
excelSheetToOpen.Filter = [Ô]Excel 97- 2003 WorkBook (*.xls)| *.xls | Excel 2007 WorkBook (*.xlsx) | *.xlsx | All files (*.*)|*.*[Ô]
excelSheetToOpen.FilterIndex = 3
excelSheetToOpen.Multiselect = True
If excelSheetToOpen.ShowDialog() = DialogResult.OK Then

Dim excelApplication As New Excel.Application
Dim excelWrkBook As Excel.Workbook
excelApplication.Visible = False
excelWrkBook = excelApplication.Workbooks.Open(excelSheetToOpen.FileName)
DirectCast(excelWrkBook.Sheets(1), Excel.Worksheet).SaveAs(Filename:=[Ô]C:[Ô] & definicao & [Ô].CSV[Ô], FileFormat:=Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV)
[ô]excelWrkBook.SaveAs(Filename:=[Ô]C:[Ô] & definicao & [Ô].CSV[Ô], FileFormat:=Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV)
excelWrkBook.Close()

end if


Depois eu usei essa query para importar

SET client_encoding TO [ô]iso-8859-1[ô];
COPY dados1 FROM [ô]C:.........data1.csv[ô] WITH DELIMITER [ô],[ô] CSV HEADER;




Funcionou com esse código que me passou, Grato.
BARTSIMONS 21/05/2013 11:11:51
#423801
Obrigado a dica de todos que postaram. Problema resolvido.

Andre.
Tópico encerrado , respostas não são mais permitidas