通过VBA将数据从Excel添加到Mysql

更新的问题…见下文

我有一个Excel表格访问MySQL数据库作为后端….

我按照以下方式将新logging插入到MySql中,但是我不确定这是否是最好的方法。

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

基本上,查询string遍历Excel表中的每一行(从1到50),并将某些单元格上的数据添加到SQL查询中,然后用rs.Open …插入(每行有5列插入作为logging)

一切运行良好,但是我只想知道是否有一个更快的方法(只需一个INSERT查询),从第1行到第50行全部插入全部50个(和5个列)。

目前它正在做50个单独的INSERT查询,所以我试图把它减less到1,但我不知道是否有可能。

新的信息:

嗨,遵循您的build议和链接(谢谢!)和一些谷歌search,我结束了以下代码…它工作正常,但插入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 

查找下面的工作stream程,以防其他人在将来遇到同样的问题。 可能不是最好的解决scheme,但100条logging一次保存在不到一秒钟,这是我以前的。 也只有一个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 

如果我运行一个语句并且不希望回复,我通常会在VBA中使用Command对象。

我将在循环之外移动open命令,然后使用Execute方法在循环中执行插入。 你不想每次都打开数据库。

这里有一个ADO方法的好页面。

这是关于批量插入 (和更新)的问题。

编辑:在他的评论看着Remou的链接,我意识到你可能甚至不需要公开。 只需使用插入的Execute方法。

此代码为我工作

  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