2016-10-06 2 views
0

У меня проблема при передаче информации из Excel в SQL с помощью макроса.Импортировать 200 000 строк в Excel в SQL с помощью макроса VBA

При запуске макроса файл начинает загружать строки, но внезапно останавливается со следующей ошибкой «Переполнение (6)», и это заставляет обрабатывать каждые 32676 строк.

Сначала я думал, что это было что-то в записях, но когда я вернусь, чтобы выполнить приговор запускается снова и снова останавливается на записи 32676,

Я пытаюсь, чтобы загрузить Excel файл с более чем 200 000 строк каждая запись состоит из 25 столбцов.

Возможно, я совершу что-то неправильно, чтобы это произошло.

Я разделяю транзакционный код.

Private Sub CommandButton1_Click() 
Dim conn As New ADODB.Connection 
conn.CommandTimeout = 0 
    Dim iRowNo As Integer 
    Dim PK_ID As String, CUST_ID As Long, DOC_TYPE As String, BILL_DOC As Long, REFERENCE As String, INV_CON As String, ORDER_SALER As String, INV_REF As String, DOC_NUM As Long, GL As Long, DOC_DATE As Double, DUE_DATE As Double, ECURRENCY As String, DOC_AMNT As Currency, USD_AMNT As Currency, PAY_TERM As String 



    With Sheets("ONREPSAP") 

     'Abrimos conexion con el SQL server 
     conn.Open "Provider=SQLOLEDB;Data Source=,1433;Initial Catalog=AmericanMovil;User ID=;Password=;Encrypt=True;" 

     'Omitimos la linea de encabezados 
     iRowNo = 2 

     'Loop until empty cell in CustomerId 
     Do Until .Cells(iRowNo, 1) = "" 
      PK_ID = .Cells(iRowNo, 1) 
      CUST_ID = .Cells(iRowNo, 2) 
      DOC_TYPE = .Cells(iRowNo, 3) 
      BILL_DOC = .Cells(iRowNo, 4) 
      REFERENCE = .Cells(iRowNo, 5) 
      INV_CON = .Cells(iRowNo, 6) 
      ORDER_SALES = .Cells(iRowNo, 7) 
      INV_REF = .Cells(iRowNo, 8) 
      DOC_NUM = .Cells(iRowNo, 9) 
      GL = .Cells(iRowNo, 10) 
      DOC_DATE = .Cells(iRowNo, 11) 
      DUE_DATE = .Cells(iRowNo, 12) 
      ECURRENCY = .Cells(iRowNo, 13) 
      DOC_AMNT = .Cells(iRowNo, 14) 
      USD_AMNT = .Cells(iRowNo, 15) 
      PAY_TERM = .Cells(iRowNo, 16) 



      'Generamos y ejecutamos la QUERY SQL para importar las lineas de excel a SQL 
      conn.Execute "insert into dbo.ONREPSAP (PK_ID, CUST_ID, DOC_TYPE, BILL_DOC, REFERENCE, INV_CON, ORDER_SALES, INV_REF, DOC_NUM, GL, DOC_DATE, DUE_DATE, ECURRENCY, DOC_AMNT, USD_AMNT, PAY_TERM) values ('" & PK_ID & "', '" & CUST_ID & "', '" & DOC_TYPE & "', '" & BILL_DOC & "', '" & REFERENCE & "', '" & INV_CON & "', '" & ORDER_SALES & "', '" & INV_REF & "', '" & DOC_NUM & "', '" & GL & "', '" & DOC_DATE & "', '" & DUE_DATE & "', '" & ECURRENCY & "', '" & DOC_AMNT & "', '" & USD_AMNT & "', '" & PAY_TERM & "')" 

      iRowNo = iRowNo + 1 
     Loop 

     MsgBox "Reporte Cargado Correctamente | The report has finish to Uploading" 


     conn.Close 
     Set conn = Nothing 

    End With 
End Sub 

В Debug, то VBA выберите iRowNo + 1 до "петли"

+3

'Dim iRowNo Как Long', а не' Integer'. – Comintern

+0

О, черт возьми ... не делай этого. Предпочтение № 1 - использование bcp. Сохраните данные в файл и дайте bcp полностью удалить все файлы. Предпочтение №2 - если вы не можете использовать bcp или упрямы, по крайней мере используйте переменные связывания (параметры) вместо 100 000 литералов. Ваш администратор базы данных будет НЕНАВИЖИТЬ НЕНАВИЖУ НЕНАВИСТЬ, если вы этого не сделаете. Если вам нужны примеры, просто спросите – Hambone

ответ

2

Как @Comintem сказал, что вы должны изменить тип для хранения больших значений.

Вы должны объявить Dim iRowNo As Long вместо Integer

Here Тип данных Резюме

Integer uses 2 bytes and Range from -32,768 to 32,767 
Long uses 4 bytes and Range from -2,147,483,648 to 2,147,483,647 

 Смежные вопросы

  • Нет связанных вопросов^_^