更新的问题......见下文
我有一张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
答案 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