【发布时间】:2017-04-11 05:58:29
【问题描述】:
所以,数据库热点。
- 我有一个包含存储过程的 MySQL 数据库。
- 我有一个 Access 文档,它链接到 MySQL 数据库(我可以调查表)作为前端(包含表单和内容)
- 我已经成功地创建了一个 ODBC 直通查询(我认为这就是它们的名称)来调用数据库中的一个存储过程。 Access 中的查询实际上只是
CALL myProcName;,当我使用Set Result = CurrentDb.OpenRecordset("myProcName")从 VBA 调用它时,它给出了我期望的结果
我想要达到的目标如下:
- 在 MySQL 中有一个带有一个参数的存储过程 => 检查!
- 该存储过程是否按预期工作 => 在 phpMyAdmin 中检查 => 检查!
- 在 Access 中有一个保存的查询,该查询链接到这个参数存储过程,并给定了一个固定的参数值 => 检查! (
CALL myProcName('myParameterValue'),我可以像执行非参数查询一样从 VBA 调用它) - 每次执行查询时都可以指定
'myParameterValue'=> 不检查
我需要以某种方式在已保存查询的 SQL 定义中指定一个参数占位符,并在 VBA 中设置该参数。对于我拥有的 VBA 部分,我认为我会觉得相当优雅:
Private Sub ParametricQuery()
Dim QDef As QueryDef
Set QDef = CurrentDb.QueryDefs("myProcName")
QDef.Parameters(*insert parameter name here*) = parameter value
Dim Result As Recordset
Set Result = QDef.OpenRecordset
Do While Not Result.EOF
MsgBox Result.Fields(1) 'Display a field from the results
Loop
End Sub
但是我将如何构建我的 SQL 定义?
PARAMETERS in_param TEXT;
CALL myProcName(in_param);
不起作用。如果我尝试
Set QDef = CurrentDb.QueryDefs("myProcName")
MsgBox QDef.Parameters.Count
我收到一个消息框,告诉我在我的查询定义中总共有 0 个参数,所以这不起作用。
我在网上发现很多人通过字符串操作在 VBA 中构建实际的 SQL。这让我不寒而栗,原因有很多(其中包括安全性、可维护性和优雅)。我坚信有更好的方法,希望能按照我上面勾勒的路线。唯一的问题是:怎么做?
【问题讨论】:
-
你能在 MySQL 中发布
CREATE PROCEDURE行吗(不需要整个过程)?需要注意的是命名参数及其类型。 -
嗯,我通过 myphpadmin 中相当不错的“创建过程”界面创建了该过程。它有一个方向为“IN”的参数(显然),类型为 VARCHAR,长度为 254(电子邮件地址的最大长度)。该程序执行简单的
SELECT * FROM table WHERE field=param
标签: mysql vba ms-access stored-procedures parameter-passing