如何通过 ODBC 在 Microsoft Access 数据库中执行具有参数(即参数声明)的预定义查询?
How to execute a pre-defined query having parameters (i.e. a PARAMETERS declaration) in a Microsoft Access database over ODBC?
我的简单问题如下:
如果我有一个 Microsoft Access 数据库,其中定义了 "query"(即 MS Access 调用查询的数据库对象的种类,只是为了避免任何歧义)定义为采用参数(使用 PARAMETERS SQL 定义中的声明)通过 ODBC 连接调用它的正确 SQL 语法是什么,包括提供参数值?
编辑/添加:
我刚刚注意到可以通过在整个 CALL 命令周围添加花括号来完成,如下所示:
{CALL myAccessQuery ('string1', 'string2', 'string3')}
这实际上正是他们在我下面提到的其他相关 SO 线程中所做的,但我只是认为这是一些与准备好的 C# 相关的特定魔术-他们的 SQL 语句的语句性质(在其中使用“?”),或者他们的 SQL 库的一些其他特性(我没有使用那种语言),所以我之前忽略了它。
任何人谁会解释大括号是什么,以及为什么他们允许执行比下面错误消息中明确说明支持的命令更多的 SQL 命令,将是一个已接受此问题的答案。
我的具体案例的更多详细信息:
我的查询采用三个参数,由查询声明开头的 "PARAMETERS" 子句定义,如下所示:
PARAMETERS myParam1 Text ( 255 ), myParam2 Text ( 255 ), myParam3 Text ( 255 );
SELECT ... <a bunch of not relevant stuff here> ;
使用(已经建立并确认有效的)ODBC 连接,我想从外部应用程序使用此查询,包括为其提供所需的三个参数。
运行 像 SELECT 等普通查询在我的外部应用程序的连接上工作得很好,但无论我 google,我似乎无法找到合适的正确提供参数和 运行 我的查询的方法?所以,我的问题是,执行此操作的正确 SQL 语法是什么?
注意:我不想要任何API针对某些特定库或类似库的特定解决方案,因为这只能解决所有开发人员中极小部分的问题谁想用不同的编程语言来做这件事,所以出于这个原因,我什至不会提出我的外部应用程序是用什么语言编写的。我只想要完整的 SQL 语法来做这件事,仅此而已,仅此而已更少。
表示这应该使用 "CALL" 关键字来完成,但是当我尝试从我的应用程序中使用它时,我只收到以下错误消息:
[42000] [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.
即,这是我在收到此错误时尝试执行的 "SQL command"(有意避免含糊不清的术语 "query"...):
CALL myAccessQuery ('string1', 'string2', 'string3')
错误消息中提到的 SQL 关键字中唯一一个似乎有用的关键字是 "PROCEDURE" 关键字,但我在查找任何相关文档时也遇到了类似的巨大困难这在 Google 上。 :-(
我怀疑 Google 在整个场景中缺乏结果的主要原因是上下文中或多或少涉及所有中心关键字的许多歧义,例如 "queries" ,"parameters","execute","call" 和 "procedure",所以对于这个 SO 问题,我希望它能构成一个更容易识别和索引的答案将来由 Google 提出。
当您通过 ODBC 连接时,查看特定于驱动程序的信息以了解它是否支持各种 ODBC 扩展(在 ODBC 调用中由大括号表示):
https://msdn.microsoft.com/en-us/library/ms675326(v=vs.85).aspx
具体来说:
ODBC provides a specific syntax for calling stored procedures. For the CommandText property of a Command object, the CommandText argument to the Execute method on a Connection object, or the Source argument to the Open method on a Recordset object, passes in a string with this syntax:
"{ [ ? = ] call procedure [ ( ? [, ? [ , … ]] ) ] }"
Each ? references an object in the Parameters collection. The first ? references Parameters(0), the next ? references Parameters(1), and so on.
The parameter references are optional and depend on the structure of the stored procedure. If you want to call a stored procedure that defines no parameters, your string would look like the following:
"{ call procedure }"
Access ODBC 驱动程序将已保存的 SELECT 参数查询公开为存储过程,因此这就是您使用此语法的原因。
我的简单问题如下:
如果我有一个 Microsoft Access 数据库,其中定义了 "query"(即 MS Access 调用查询的数据库对象的种类,只是为了避免任何歧义)定义为采用参数(使用 PARAMETERS SQL 定义中的声明)通过 ODBC 连接调用它的正确 SQL 语法是什么,包括提供参数值?
编辑/添加:
我刚刚注意到可以通过在整个 CALL 命令周围添加花括号来完成,如下所示:
{CALL myAccessQuery ('string1', 'string2', 'string3')}
这实际上正是他们在我下面提到的其他相关 SO 线程中所做的,但我只是认为这是一些与准备好的 C# 相关的特定魔术-他们的 SQL 语句的语句性质(在其中使用“?”),或者他们的 SQL 库的一些其他特性(我没有使用那种语言),所以我之前忽略了它。
任何人谁会解释大括号是什么,以及为什么他们允许执行比下面错误消息中明确说明支持的命令更多的 SQL 命令,将是一个已接受此问题的答案。
我的具体案例的更多详细信息:
我的查询采用三个参数,由查询声明开头的 "PARAMETERS" 子句定义,如下所示:
PARAMETERS myParam1 Text ( 255 ), myParam2 Text ( 255 ), myParam3 Text ( 255 );
SELECT ... <a bunch of not relevant stuff here> ;
使用(已经建立并确认有效的)ODBC 连接,我想从外部应用程序使用此查询,包括为其提供所需的三个参数。
运行 像 SELECT 等普通查询在我的外部应用程序的连接上工作得很好,但无论我 google,我似乎无法找到合适的正确提供参数和 运行 我的查询的方法?所以,我的问题是,执行此操作的正确 SQL 语法是什么?
注意:我不想要任何API针对某些特定库或类似库的特定解决方案,因为这只能解决所有开发人员中极小部分的问题谁想用不同的编程语言来做这件事,所以出于这个原因,我什至不会提出我的外部应用程序是用什么语言编写的。我只想要完整的 SQL 语法来做这件事,仅此而已,仅此而已更少。
[42000] [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.
即,这是我在收到此错误时尝试执行的 "SQL command"(有意避免含糊不清的术语 "query"...):
CALL myAccessQuery ('string1', 'string2', 'string3')
错误消息中提到的 SQL 关键字中唯一一个似乎有用的关键字是 "PROCEDURE" 关键字,但我在查找任何相关文档时也遇到了类似的巨大困难这在 Google 上。 :-(
我怀疑 Google 在整个场景中缺乏结果的主要原因是上下文中或多或少涉及所有中心关键字的许多歧义,例如 "queries" ,"parameters","execute","call" 和 "procedure",所以对于这个 SO 问题,我希望它能构成一个更容易识别和索引的答案将来由 Google 提出。
当您通过 ODBC 连接时,查看特定于驱动程序的信息以了解它是否支持各种 ODBC 扩展(在 ODBC 调用中由大括号表示):
https://msdn.microsoft.com/en-us/library/ms675326(v=vs.85).aspx
具体来说:
ODBC provides a specific syntax for calling stored procedures. For the CommandText property of a Command object, the CommandText argument to the Execute method on a Connection object, or the Source argument to the Open method on a Recordset object, passes in a string with this syntax:
"{ [ ? = ] call procedure [ ( ? [, ? [ , … ]] ) ] }"
Each ? references an object in the Parameters collection. The first ? references Parameters(0), the next ? references Parameters(1), and so on. The parameter references are optional and depend on the structure of the stored procedure. If you want to call a stored procedure that defines no parameters, your string would look like the following:
"{ call procedure }"
Access ODBC 驱动程序将已保存的 SELECT 参数查询公开为存储过程,因此这就是您使用此语法的原因。