Добавление данных из Excel в Mysql через VBA - PullRequest
2 голосов
/ 23 июня 2010

ОБНОВЛЕННЫЙ ВОПРОС ... СМ. НИЖЕ

У меня есть лист Excel, который обращается к базе данных MySQL в качестве бэкэнда ....

Я вставляю новые записи в MySql следующим образом, но я не уверен, что это лучший способ.

For rowline = 1 To 50
   strSQL = myquerystring (INSERT 5 columns per excel row)                    
   rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic
Next rowline

В основном строка запроса проходит через каждую строку в листе Excel (от 1 до 50), и данные по определенным ячейкам добавляются в запрос sql, а затем вставляются с помощью rs.Open .... (в каждой строке есть около 5 столбцов, которые вставляются как записи)

Все работает хорошо, однако я просто хочу знать, есть ли более быстрый путь (только один запрос INSERT), вставляя все 50 (и 5 столбцов в каждой), от строки 1 до 50, все сразу.

В данный момент он выполняет 50 отдельных запросов INSERT, поэтому я пытаюсь уменьшить его до 1, но не знаю, возможно ли это.

НОВАЯ ИНФОРМАЦИЯ:

Привет, следуя вашим советам и ссылкам (спасибо!) И некоторому поиску в Google, я получил следующий код ... Он работает нормально, ОДНАКО для вставки 100 строк это занимает около 15 секунд .... это слишком много. Я надеюсь, что смогу получить некоторый код / ​​идеи о том, как выполнить запрос один раз (вставив все 100 строк одним ударом). Обратите внимание, что я новичок в этом вопросе, поэтому, если вы подскажете мне, как это сделать, это будет очень ценно.

Public Sub INSERT_to_MySQL()

   Dim conn As ADODB.Connection
   Dim cmd As ADODB.Command
   Dim strSQL As String

   app_enable_false

   On Error GoTo no_DB_connection_error
resume_after_connecting:

   Set cmd = New ADODB.Command
   cmd.ActiveConnection = oConn

   ' LOOP and INSERT the data
   ' 100 rows take approx 15 seconds to INSERT
   For rowcursor= 1 To 100
                the_table = "`global`.`filesaved` "
                strSQL = "INSERT INTO " & the_table & " (Client_Name, OriginCity, DestinationCity, ValidFrom, ValidTo, Quote_Number, Cost1, Cost2, Cost3) "
                strSQL = strSQL & " VALUES ('" & esc(Range("BB" & rowcursor)) & "','" & esc(Range("BC" & rowcursor)) & "','" & esc(Range("BD" & rowcursor)) & "','" & Format(Range("BE" & rowcursor), "yyyy-mm-dd") & "','" & Format(Range("BF" & rowcursor), "yyyy-mm-dd")
                strSQL = strSQL & "','" & esc(Range("BH" & rowcursor)) & "','" & esc(Range("BJ" & rowcursor)) & "','" & esc(Range("BK" & rowcursor)) & "','" & esc(Range("BJ" & rowcursor)) & "')"
                cmd.CommandText = strSQL
                cmd.Execute
   Next rowcursor

   app_enable_true

   Exit Sub

no_DB_connection_error:

   ConnectDB
   GoTo resume_after_connecting

End Sub

Ответы [ 4 ]

1 голос
/ 25 июня 2010

Найдите ниже процесс, который работает, если кто-то еще столкнется с такой же проблемой в будущем. Возможно, это не лучшее решение, но 100 записей сохраняются одновременно менее чем за секунду, что я и сделал. Также выполняется только один запрос INSERT (вместо 100 разных запросов для каждой строки.

Спасибо всем за руководство.

   Dim conn As ADODB.Connection
   Dim cmd As ADODB.Command
   Dim rst_recordset As ADODB.Recordset
   Dim strSQL As String
   Dim strSQL2  as string


   On Error GoTo no_DB_connection_error
resume_after_connecting:

   Set cmd = New ADODB.Command
   cmd.ActiveConnection = oConn

   ' LOOP and INSERT the data
   lastrow = Range("BB65536").End(xlUp).Row



                the_table = "`global`.`filesaved` "
                strSQL = "INSERT INTO `global`.`filesaved` " & " (Client_Name, OriginCity, DestCity, ValidFrom, ValidTo, Quote_Number, Cost1, Cost2, Cost3) VALUES "
                strSQL2 = ""
                For excel_row = 1 To lastrow 
                    strSQL2 = strSQL2 & " ('" & cells(excel_row,1) & "','" & cells(excel_row,2) & "','" & cells(excel_row,3) & "','" & cells(excel_row,4) & "','" & cells(excel_row,5) & "','" & cells(excel_row,6) & "','" & cells(excel_row,7) & "','" & cells(excel_row,8) & "','" & cells(excel_row,9) & "') ,"  
                next excel_row

                strSQL = strSQL & strSQL2
                Mid(strSQL, Len(strSQL), 1) = ";" ' gets rid of the last comma

                cmd.CommandText = strSQL
                cmd.Execute
0 голосов
/ 20 мая 2013

Этот код работал для меня

    Sub insertdata()

Dim year As String

Set rs = CreateObject("ADODB.Recordset") 
Database_Name = Range("b3").Value ' Name of database
User_ID = Range("b4").Value 'id user or username
Password = Range("b5").Value 'Password
Server_Name =Range("b2").Value

' Query for fetching Maximum Date
  ' LOOP and INSERT the data
   lastrow = Range("BB65536").End(xlUp).Row



                the_table = "`admin`.`test` "
                strSQL = "INSERT INTO `drawing`.`test` " & " (tests,test2) VALUES "
                strSQL2 = ""
                For excel_row = 1 To 100
                    strSQL2 = strSQL2 & " ('" & Cells(excel_row, 1) & "','" & Cells(excel_row, 2) & "') ,"
                Next excel_row

                strSQL = strSQL & strSQL2
                Mid(strSQL, Len(strSQL), 1) = ";" '
' ADODB connection
Set Cn = CreateObject("ADODB.Connection") 'NEW STATEMENT
Cn.Open "Driver={MySQL ODBC 5.1 Driver};Server=" & Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"


rs.Open strSQL, Cn, adOpenStatic

Dim myArray()


End Sub
0 голосов
/ 23 июня 2010

Я бы переместил команду открытия за пределы цикла, а затем использовал метод Execute, чтобы выполнить вставки в цикл.Вы не хотите каждый раз открывать базу данных.

Вот хорошая страница методов ADO .

Вот вопрос по Batch Inserting (и Обновление).

РЕДАКТИРОВАТЬ: Глядя на ссылку Ремо в его комментарии, я понял, что вам, вероятно, даже не нужно открывать.Просто используйте метод Execute для вставок.

0 голосов
/ 23 июня 2010

Если я запускаю инструкцию и не ожидаю ответа, я обычно использую объект Command в VBA.

...