免责声明:,这是遗留代码,我不能重写所有东西(相信我,我很乐意)。
我正在尝试执行一个使用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 -> ODBC -> DB2方法直接通过BDE和而不是进行连接。
编辑:环境信息:
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".发布于 2013-08-23 17:09:27
看来这个问题没有解决办法。作为@TOndrej和@DavidG的指针,这个QC问题从未被解决,似乎没有人知道如何绕过它。
在我的情况下,我会放弃并通知我的上级,除非我们重写应用程序,否则我们不能再支持DB2了。不管怎样,多亏了所有想帮我的人。
发布于 2013-08-22 09:45:12
Delphi7有一个缺陷报告http://qc.embarcadero.com/wc/qcmain.aspx?d=12905,看起来几乎是一样的。我唯一的想法是,如果用问号替换:name会发生什么。在db2中,Java参数使用?您将需要将参数用作一个位置。
发布于 2013-08-22 00:11:05
我会尝试使用TQuery.Params检查和或替换Params。例如,您可以调用TQuery.Params.Clear来删除所有参数,然后调用TQuery.Params.CreateParam来创建一个参数,并查看该参数是否有效,以及您得到了什么样的消息。或者,您可以按原样使用自动参数创建,并检查TQuery.Params.Items的属性。
此外,为了帮助解决这个问题,您可以尝试将count(*)替换为仅*或其中一个字段的名称,以确定这是否是问题的一部分。
https://stackoverflow.com/questions/18357230
复制相似问题