我尝试使用直通查询从MS Access VBA调用mysql存储过程。代码如下:
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = "DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=localhost;PORT=3306;DATABASE=accounting_supp_db;User=xxx;Password=xxx;Option=3"
qdf.SQL = "CALL MyStoredProcedure('10156','2021-03-03','2021-03-10')"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset
rst.Close
Set rst = Nothing
Set qdf = Nothing但它返回错误3305:直通查询中连接字符串无效。连接字符串有什么问题吗?
thx
发布于 2021-03-14 13:18:22
好吧,有一个办法可以解决这个问题吗?
只需使用功能区中的外部数据,然后将表从access链接到MySQL即可。让它工作起来--一旦你这样做了?
然后在你的代码中这样做:
dim rst as DAO.RecordSet
With CurrentDB.queryDefs("MyPTQuery")
.Connection = currentdb.tableDefs("The working linked table").Connection
.SQL = "CALL MyStoreProc('10156','2021-03-03','2021-03-10')"
set rst = .OpenRecordSet
End if我想你可以添加到上面的.ReturnsRecords = True,但是再加一次?
那么,创建一个PT查询-设置正确的连接。然后,您可以在代码中执行此操作:
Dim rst1 as DAO.RecordSet
Dim rst2 as DAO.ReocrdSet
With Currentdb.tableDefs("MyPTQuery")
.SQL = "CALL MyStoredProcedure('10156','2021-03-03','2021-03-10')"
set rst1 = .OpenRecordSet
END with
With Currentdb.tableDefs("MyPTQuery")
.SQL = "CALL MyStoredProcedure('10777','2021-04-03','2021-05-10')"
set rst2 = .OpenRecordSet
End With注意我们是如何避免创建查询定义的。注意我们如何一遍又一遍地使用单点查询。
更好的是,假设您想要将该存储过程用于报告?我们将以"MyPTQuery“作为报告的基础
然后执行以下操作:
With Currentdb.tableDefs("MyPTQuery")
.SQL = "CALL MyStoredProcedure('10777','2021-04-03','2021-05-10')"
End With
docmd.OpenReport "rptCustomerProjects", acViewPreview实际上,你可以这样写上面的代码:
Currentdb.tableDefs("MyPTQuery").SQL = "CALL MyStoredProcedure('10777','2021-04-03','2021-05-10')"
docmd.OpenReport "rptCustomerProjects", acViewPreview因此,我强烈建议您将连接字符串保存在PT查询中。这样,你的代码就不会有乱七八糟的连接字符串了--这样的连接现在已经从你的代码中“移出”了--你可以很容易地改变整个数据库的连接,而不需要改变任何代码。
那么,当您运行表重新链接代码时呢?使该重新链接代码还更新任何PT查询。这样,您现在就可以重新链接应用程序,并将其指向测试数据库或生产数据库或其他任何数据库。因此,代码中没有连接字符串是上述情况的结果。
不考虑上面的内容?让一个链接表正常工作--然后按照上面的第一个例子,从链接表中“窃取”已知的连接,并将其放入PT查询的连接中。
https://stackoverflow.com/questions/66620064
复制相似问题