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

时间:2012-06-14 13:40:05

标签: 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,并且避免使用Parameters,也许这就是为什么

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

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

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

  3. 你做错了。

  4. 我正在使用Delphi XE2,但我在2007年,2009年,2010年和XE中看到过类似的狡猾行为。 我正在使用Microsoft OLEDB Provider for SQL Server作为我的OLEDB Provider。

3 个答案:

答案 0 :(得分:1)

:的命名参数?即使在Visual Studio(ADO.NET)上,我总是将它与@一起使用。 在T-SQL中,参数和变量的前缀为@

不记得有问题...你确定你没有选择Native Client (安装了SQL Server客户端安装)而不是用于SQL Server的OLEDB Provider(其中 附带Windows)?

答案 1 :(得分:0)

不幸的是,我有一段时间没有使用Delphi,所以,我没有办法从Delphi的角度来验证这个答案。

这是我第一次看到以冒号(:)为前缀的命名参数。通常,在ADODB中,命名参数的前缀为at(@),是的,未命名的参数带有问号(?)。

命名参数的一个显着优点是它们可以重复使用,即

INSERT INTO TABLE T VALUES (@id, @id, 'Hello World');

在ADODB级别。使用命名或未命名的参数后,您可以使用CommandText.Parameters.Refresh作为创建参数的快速方法。

答案 2 :(得分:0)

是的,在某些情况下,?的参数会失败。我发现有时我需要使用:named参数。命名参数对于使用DB参数值具有优势,因为设置了Name属性可以更轻松地调试ADO查询或数据集或表。

我不明白为什么。如果您遇到此问题,请首先检查您使用的是正确的OLEDB提供程序,并检查版本。还要检查由您生成的错误SQL导致的潜在解析错误。

我怀疑在我没有源代码的代码中OLEDB提供程序内部的行为是这个怪癖的罪魁祸首。 Delphi ADO类包装器是从Delphi的数据库组件层体系结构到ADO的核心查询/表/数据集API的翻译器,所有这些API都围绕着一组处理{{3 }}