StackOverflow 上有几个问题,它们的答案似乎在 ADO/OleDB、delphi TADOQuery/TADOCommand 和参数主题方面相互矛盾。
可以通过两种方式引入参数:在 ADO 组件的 CommandText 或 SQL 属性中。命名参数对我来说大部分时间都有效,用冒号引入:
select a, b, c from bar where bat = :baz
这对我来说 99% 的情况下都有效,很好。我时不时地发现 ADO 或 Delphi 的包装器不接受“:baz”并要求我写这个:
select f, g, h from bar where bat = ?
这会产生未命名参数,而不是命名参数。当 ADO 查询或 ADO 命令仅包含一个参数时,这并不是什么大问题。但这并不是 ADO 对我采取行动的时候。昨天它以一种方式运行,今天则以不同的方式运行,在单个 TADOCommand 对象中使用双命令,如下所示,在一个 CommandText 字符串中使用两个命令:
delete from bar where id = :id1
delete from bat where id = :id2
我必须将其更改为:
delete from bar where id = ?
delete from bat where id = ?
昨天一整天都在工作。今天,我不得不将其改回第一个版本,才能使其正常工作。症状是 ADO 参数消失并且不会回来,当我尝试执行命令时,当我尝试访问 Parameters[0]
时,出现错误,索引超出范围。没有任何东西给我任何关于参数即将消失的警告。看起来,在设计时,与 ADO 数据集的一些连接会特别影响 TADOCommand
组件,并且它“只会让我崩溃”。当您尝试编写查询或命令,并且您知道它可以工作,但 ADO 组件决定不接受“?”时,这尤其令人抓狂。或现在“:x”。您可以通过从一种切换到另一种来解决其完全无法运行的问题。但这让我很沮丧,而且可能实际上完全阻止了其他人。我知道有些人总是在代码中动态构建 SQL,并避免使用参数
,也许这就是原因。
我期望的问题的可能答案是:
ADO 不支持多个命令,或者至少 Delphi 的包装器不支持。或者
TADOCommand
在这里无法可靠地工作。参数是所有 ADO 或所有 Delphi 的 ADO 包装器中的错误区域吗?
你做错了。
我正在使用 Delphi XE2,但我在 2007、2009、2010 和 XE 中也看到过类似的危险行为。 我使用 Microsoft OLEDB Provider for SQL Server 作为我的 OLEDB 提供程序。
最佳答案
命名参数带有:
?我总是将它与 @
一起使用,甚至在 Visual Studio (ADO.NET) 上也是如此。
在T-SQL中参数和变量都以@
为前缀。
不记得有过问题...您确定不选择 Native Client (与 SQL Server 客户端安装一起安装)而不是 OLEDB Provider for SQL Server( Windows 附带)?
关于delphi - 在某些情况下,ADO 组件(尤其是 TADOCommand)是否可以更可靠地使用未命名或命名参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11034362/