参数可以引入两种方式,在ADT组件的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参数消失,不会回来,当我尝试执行命令时,得到一个错误,索引超出范围,当我尝试访问参数[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 Provider。