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

时间:2010-06-23 17:38:31

标签: mysql excel vba insert

更新的问题......见下文

我有一张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查询),从第1行到第50行插入所有50个(和每个5列),一次全部。

目前正在进行50次单独的INSERT查询,所以我试图将其减少到1,但我不知道是否可能。

新信息:

您好,按照您的建议和链接(谢谢!)和一些谷歌搜索,我最终得到以下代码... 它工作正常,但要插入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 个答案:

答案 0 :(得分:1)

在下面找到一个有效的流程,万一其他人将来遇到同样的问题。 可能不是最好的解决方案,但在不到一秒的时间内就可以同时保存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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会在循环外移动open命令,然后使用Execute方法在循环中执行插入操作。您不希望每次都在数据库上打开。

这是ADO methods的好页面。

以下是关于Batch Inserting(和更新)的问题。

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

答案 3 :(得分:0)

这段代码对我有用

    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