Delphi BDE、DB2和TQuery参数

Delphi BDE、DB2和TQuery参数,delphi,db2,bde,Delphi,Db2,Bde,免责声明:这是遗留代码,我无法重写所有内容(相信我,我愿意) 我试图执行一个使用BDE和DB2的传统Delphi应用程序,但我无法运行参数化查询 QueryA.SQL.Text := 'select count (*) from syscat.tables where tabname = ''Foo'''; QueryA.Open; // works as expected QueryB.SQL.Text := 'select count (*) from syscat.tables wher

免责声明:这是遗留代码,我无法重写所有内容(相信我,我愿意)

我试图执行一个使用BDE和DB2的传统Delphi应用程序,但我无法运行参数化查询

QueryA.SQL.Text := 'select count (*) from syscat.tables where tabname = ''Foo''';
QueryA.Open; // works as expected

QueryB.SQL.Text := 'select count (*) from syscat.tables where tabname = :name';
QueryB.ParamByName('name').ParamType := ptInput;
QueryB.ParamByName('name').DataType := ftString;
QueryB.ParamByName('name').AsString := 'Foo';
QueryB.Open; // Error: "Operation not applicable"

QueryC.SQL.Text := 'select count (*) from syscat.tables where tabname = :name';
QueryC.ParamByName('name').ParamType := ptInput;
QueryC.ParamByName('name').DataType := ftString;
QueryC.ParamByName('name').Clear;
QueryC.Open; // Surprisingly, no erros here
现在。。。为什么QueryB示例不起作用?我尝试了我能想象到的一切:使用
Value
而不是
AsString
,调用
Prepare
UnPrepare
,但似乎没有任何效果。有什么想法吗

重要提示:我通过BDE直接连接,而不是使用BDE->ODBC->DB2方法

编辑:环境信息:

Delphi Version: 5, UpdatePack 1
BDE: 5.01
OS: Windows 7 SP1, x64

D:\SQLLIB\BIN>db2level
DB21085I  Instance "DB2" uses "32" bits and DB2 code release "SQL09052" with
level identifier "03030107".
Informational tokens are "DB2 v9.5.201.346", "s080911", "WR21421", and Fix Pack "2a".
Product is installed at "D:\SQLLIB" with DB2 Copy Name "DB2COPY1".

我会尝试使用TQuery.Params检查和/或替换参数。例如,您可以调用TQuery.Params.Clear删除所有参数,然后调用TQuery.Params.CreateParam创建一个参数,查看该参数是否有效,以及收到的消息类型。或者,您可以按原样使用自动参数创建,并检查TQuery.Params.Items的属性


此外,为了帮助解决这个问题,您可以尝试用just*或其中一个字段的名称替换count(*),以查看这是否是问题的一部分。

Delphi 7的一个缺陷报告看起来几乎相同。我唯一的想法是,如果用问号替换:name,那么会发生什么?您需要将参数用作BDE未使用的位置,但使用ADO查询时,数据库应填写参数类型信息。仅当已设置连接字符串(直接设置或由TADOConnection对象设置)时,才会发生这种情况。尝试删除ParamType和DataType调用,并确保已设置连接。

看来没有解决此问题的方法。正如@TOndrej和@DavidG所指出的,这个问题从未解决过,似乎没有人知道如何解决这个问题


在我的情况下,我将放弃并通知我的上级,除非我们重写应用程序,否则我们将无法再支持DB2。无论如何,感谢所有试图帮助我的人。

很抱歉这可能是一个迟钝的问题,但是如果QueryA可以工作,为什么不在运行时简单地构造Sql.Text并完全避免使用参数呢?我似乎记得像您这样的问题在BDE中并非闻所未闻。@Martyn,通过手动构造包含数据的查询来避免参数是导致SQL注入漏洞的原因。@MartynA的问题是,整个应用程序(而且是一个大应用程序)依赖于参数。。。改变一切是不可行的。。。另外,正如罗伯·肯尼迪所说,这是一个巨大的弱点@TOndrej Yep,我看过这个,但我仍然希望这里的人知道这种情况的解决方法…只是尝试手动创建参数,但没有运气。。。似乎没有解决此问题的方法:(好主意!不幸的是,不起作用。尝试了
?'(手动创建参数)和
:?',仍然是相同的错误。?在其他语言(C族和Java?)中使用,Delphi一直使用:表示参数。请注意,这样您就不能再访问
qc.embarcadero.com
链接了。如果您需要访问旧的qc数据,请查看。