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

时间:2014-08-13 15:16:47

标签: excel vba stored-procedures cursor

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

奇怪的是:只要我的spoc不使用游标或它使用游标但没有“SELECT”语句,一切都可以在Excel中运行。甚至多个SELECT语句都可以工作,但当然不能使用游标。

连接设置绝对可以。我在使用mysql-proxy时发现的是,记录的输出有点奇怪,因为没有调用存储过程(但是我得到的结果没有使用游标)但是其他几个调用(我想从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(不完整但可运行。此处缺少关闭游标等)

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

1 个答案:

答案 0 :(得分:0)

经过一周的努力,我找到了解决方法。我使用了常规查询,而不是使用ADODB.Command(专门为此设计,如果我理解正确的话)。请注意,如果我用“;”结束语句,它不起作用(在我的情况下),这是我认为的某种错误。

长话短说:这对我有用:

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