我的简单问题如下:
如果我有一个带有定义的“查询”的Microsoft Access数据库(即,MS Access调用查询的数据库对象的种类,只是为了避免任何歧义)定义为采用参数(在其SQL定义内使用PARAMETERS声明)在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语法,仅此而已。
另一个SO问题指示应使用“ CALL”关键字完成此操作,但是当我尝试从应用程序中使用此关键字时,我仅收到以下错误消息:
[42000] [Microsoft] [ODBC Microsoft Access驱动程序]无效的SQL语句;预期的“删除”,“插入”,“过程”,“选择”或“更新”。
即,这是我在遇到此错误时试图执行的“ SQL命令”(目的是避免使用模糊的术语“查询” ...):
CALL myAccessQuery ('string1', 'string2', 'string3')
错误消息中提到的似乎唯一有用的SQL关键字之一就是“ PROCEDURE”关键字,但在Google上与此相关的任何相关文档的查找也遇到了同样大的困难。:-(
我怀疑Google在整个情况下缺乏结果的大部分原因是涉及上下文中或多或少所有中心关键字的众多含混不清之处,例如“查询”,“参数”,“执行”,“调用”和“ “过程”,因此对于这样的SO问题,我希望它会构成一个更容易识别和索引的答案,以便将来由Google提出。
通过ODBC连接时,请查看特定于驱动程序的信息,以查看其是否支持各种ODBC扩展(由ODBC调用中的花括号指示):
https://msdn.microsoft.com/zh-CN/library/ms675326(v=vs.85).aspx
具体来说:
ODBC提供了用于调用存储过程的特定语法。对于Command对象的CommandText属性,Connection对象上Execute方法的CommandText参数,或Recordset对象上Open方法的Source参数,使用以下语法传递一个字符串:
"{ [ ? = ] call procedure [ ( ? [, ? [ , … ]] ) ] }"
每个 ?引用Parameters集合中的对象。首先 ?引用Parameters(0),下一个?引用Parameters(1),依此类推。参数引用是可选的,并且取决于存储过程的结构。如果要调用未定义任何参数的存储过程,则字符串将如下所示:
"{ call procedure }"
Access ODBC驱动程序将已保存的SELECT参数查询作为存储过程公开,因此这就是您使用此语法的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句