MySQL的VBA连接问题-在宏的顶部而不是底部

时间:2019-02-21 15:39:29

标签: mysql excel vba adodb

我有一个宏,用于打开与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消息,该消息似乎表明那里的连接已丢失。

感谢您的帮助!

2 个答案:

答案 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”,现在我又收到了错误消息。事实证明,我的用户被拒绝使用该表的“插入命令”(即使我在确实使用过的表之后对其建模),所以看起来我只需要弄清楚这一点。谢谢大家!