使用Excel VBA中的游标调用MySQL存储过程 – >命令不同步

我在使用游标的MySQL中编写了一个存储过程。 从mysql和mysql工作台调用spoc时,一切正常。 但是,一旦我尝试从Excel VBA中调用spoc,我总是会得到一个错误:“命令不同步;现在不能运行此命令”。 “OPEN cursorName”行 导致错误消息。

奇怪的是:只要我的spoc不使用游标,或者它使用游标,但不会使用“SELECT”语句,一切都可以在Excel中使用。 即使多个SELECT语句也可以工作,但是当然不能用游标。

连接设置肯定是好的。 除此之外,当我使用mysql-proxy的时候发现,logging的输出有点奇怪,因为没有调用存储过程(但是我得到的结果没有使用游标),而是其他一些调用(我猜ODBC驱动程序本身?)。

我期待着任何答案! 谢谢大家。

农庄

一个最小的例子:

MySQL的

DELIMITER // DROP PROCEDURE IF EXISTS buildTree // CREATE PROCEDURE buildTree(IN rootId INT) BEGIN DECLARE bla CURSOR FOR ( SELECT 1 ); OPEN bla; SELECT 1; END // 

Excel的VBA(不完整,但可运行。closures光标等缺less这里)

 Public Function QueryMySQL() Dim conn As ADODB.Connection Dim rst As New ADODB.Recordset Set conn = New ADODB.Connection conn.ConnectionString = "DRIVER={MySQL ODBC 5.3 Unicode Driver}; SERVER=localhost; PORT=4040; DATABASE=mydbname; UID=username; OPTION=3" conn.CursorLocation = adUseClient conn.Open Set spCommand = New ADODB.Command spCommand.CommandText = "buildTree" spCommand.CommandType = adCmdStoredProc spCommand.CommandTimeout = 30 Set spCommand.ActiveConnection = conn Set param1 = spCommand.CreateParameter("rootId", adInteger, adParamInput) param1.Value = 1551 spCommand.Parameters.Append param1 Set rs = spCommand.Execute End Function 

MySQL代理日志

 Logged query: SET NAMES utf8 Logged query: SET character_set_results = NULL Logged query: SET SQL_AUTO_IS_NULL = 0 Logged query: select database() Logged query: select database() Logged query: SELECT @@tx_isolation Logged query: set @@sql_select_limit=DEFAULT 

尝试了整整一周后,我find了一个解决方法。 而不是使用ADODB.Command(正是为此devise的,如果我理解正确),我使用了一个常规的查询。 请注意,如果我用“;”结束语句,这是行不通的(这在我的情况下),这是我想的错误。

长话短说:这是为我工作:

 Set mysqlConAsync = New ADODB.Connection With mysqlConAsync .ConnectionString = "DRIVER={MySQL ODBC 5.3 Unicode Driver}; SERVER=localhost; PORT=3306; DATABASE=dbname; UID=root; OPTION=67108867" .CursorLocation = adUseClient End With mysqlConAsync.Open Set rst = New ADODB.Recordset With rst qry = "CALL buildTree()" .CursorLocation = adUseClient .Open query, mysqlConAsync, , adLockReadOnly, adAsyncFetch End With