delphi - 在某些情况下,ADO 组件(尤其是 TADOCommand)是否可以更可靠地使用未命名或命名参数?

标签 delphi ado

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,并避免使用参数,也许这就是原因

我期望的问题的可能答案是:

  1. ADO 不支持多个命令,或者至少 Delphi 的包装器不支持。或者 TADOCommand 在这里无法可靠地工作。

  2. 参数是所有 ADO 或所有 Delphi 的 ADO 包装器中的错误区域吗?

  3. 你做错了。

我正在使用 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/

相关文章:

delphi - 结束或取消 Delphi 应用程序中的拖放操作

vba - ADO Recordset to Excel 电子表格在 Excel 2007 中正确打开,在 Excel 2013 中缺少参数

sql-server - 跨不同 SQL 数据库兼容的 DDL(CREATE TABLE)?

mysql - 如何在 ASP 中测试空 SQL 结果

Delphi - 使用 FormatFloat ('0.##' 时浮点舍入不一致,argValue)

delphi - THttpClient 中的 KeepAlive 如何工作?

delphi - 更改 TAchart 系列的背景颜色

arrays - 当查找映射到小整数的常量时,使用 case 语句还是常量数组更快?

sql-server - 使用参数从 Delphi 调用 SQL Server 存储过程?

excel - 使用 rst.Fields 将多个单元格发送到我的 SharePoint