我有一个宏,用于打开与MySQL库的ADODB连接。在宏中生成两个查询。第一个有效,是用于检查重复项的select语句。第二个方法不起作用,是将选择语句引用的记录插入同一表。我没有收到来自VBA的任何错误,并且当我直接将其复制/粘贴到MySQL中时,查询工作正常。
在宏的顶部,按如下所示建立连接:
TimesheetConn = "DRIVER={MySQL ODBC 5.3 ANSI Driver}; SERVER=*server number*;PORT=*port number*;database=my_db;UID=User;PWD=password;Option=2"
'Connection Info
Dim cnn As ADODB.Connection
On Error GoTo AdoError
Set cnn = New ADODB.Connection
With cnn
.ConnectionString = TimesheetConn
.Open
.CommandTimeout = 0
End With
Set FIT_Data = New ADODB.Recordset
Set Task_Data = New ADODB.Recordset
然后我开发Select查询(fitidquery)并以以下方式运行它:
FIT_Data.Open fitidquery, cnn, CursorType = 2
我不关闭连接,但接着通过遍历行并分配变量来继续生成下一个查询,即插入查询(addtasks3)。
然后我尝试使用以下方式再次调用连接:
Task_Data.Open addtasks3, cnn, adOpenForwardOnly, adLockReadOnly
cnn.Close
它不起作用,也没有给我关于VBA或SQL的任何错误。如前所述,将debug.print(addtasks3)的结果复制到MySQL中,查询将正确运行并插入记录。
我尝试用相同的参数打开第二个连接。那也没有用。我将On Error语言移至第二个查询调用的前面,然后移至AdoError消息,该消息似乎表明那里的连接已丢失。
感谢您的帮助!
答案 0 :(得分:1)
如果您发布Insert
语句,则无需包含记录集。您只需执行
cnn.Execute addtasks3
或者,如果要获取插入的行数,请使用ADODB.Command
:
Dim cmd As New ADODB.Command
cmd.ActiveConnection = cnn
cmd.CommandText = addtasks3
Dim rowsInserted As Long
Call cmd.Execute(rowsInserted)
Debug.Print rowsInserted & " rows inserted."
答案 1 :(得分:0)
因此,我必须对提到错误的所有人表示感谢。重新阅读后,您的描述最终使我感到满意。我以为On Error Resume Next仅适用于代码前面的那一行(在我进行的过程中,我仍然是VBA新手学习的东西),却没有意识到它将继续执行其余的代码。我的第一个查询之前有一个,因为如果它是新行,它将不会返回任何内容来检查重复项并导致错误。因此,为什么我没有收到错误消息。
我在那部分之后添加了“ On Error GoTo 0”,现在我又收到了错误消息。事实证明,我的用户被拒绝使用该表的“插入命令”(即使我在确实使用过的表之后对其建模),所以看起来我只需要弄清楚这一点。谢谢大家!