#sql #excel #rows #vba
#sql #excel #строки #vba
Вопрос:
У меня проблема при передаче информации из Excel в SQL с помощью макроса.
Когда вы запускаете макрос, файл начинает загружать строки, но внезапно останавливается со следующей ошибкой «Переполнение (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 ('" amp; PK_ID amp; "', '" amp; CUST_ID amp; "', '" amp; DOC_TYPE amp; "', '" amp; BILL_DOC amp; "', '" amp; REFERENCE amp; "', '" amp; INV_CON amp; "', '" amp; ORDER_SALES amp; "', '" amp; INV_REF amp; "', '" amp; DOC_NUM amp; "', '" amp; GL amp; "', '" amp; DOC_DATE amp; "', '" amp; DUE_DATE amp; "', '" amp; ECURRENCY amp; "', '" amp; DOC_AMNT amp; "', '" amp; USD_AMNT amp; "', '" amp; PAY_TERM amp; "')"
iRowNo = iRowNo 1
Loop
MsgBox "Reporte Cargado Correctamente | The report has finish to Uploading"
conn.Close
Set conn = Nothing
End With
End Sub
При отладке VBA выбирает iRowNo 1 перед «Циклом»
Комментарии:
1.
Dim iRowNo As Long
, нетInteger
.2. Боже мой … не делай этого. Предпочтение #1 — использовать bcp. Сохраните данные в файл, и пусть bcp проглотит все это сразу. Предпочтение # 2 — если вы не можете использовать bcp или упрямы, по крайней мере, используйте переменные привязки (параметры) вместо 100 000 литералов. Ваш администратор базы данных будет НЕНАВИДЕТЬ вас, если вы этого не сделаете. Если вам нужны примеры, просто спросите
Ответ №1:
Как сказал @Comintem, вам нужно изменить тип для хранения больших значений.
Вы должны объявить Dim iRowNo As Long
вместо Integer
Здесь сводка типов данных
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