免责声明:这是遗留代码,我根本无法重写所有内容(相信我,我愿意)。
我正在尝试执行使用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".
答案 0 :(得分:1)
Delphi 7的缺陷报告http://qc.embarcadero.com/wc/qcmain.aspx?d=12905看起来几乎相同。我唯一想到的是,如果用问号替换:name,会发生什么。“?”在db2 Java参数中使用?您需要将参数用作位置
答案 1 :(得分:0)
我会尝试使用TQuery.Params检查和替换Params。例如,您可以调用TQuery.Params.Clear来删除所有参数,然后调用TQuery.Params.CreateParam来创建参数,看看它是否有效,以及您获得的是什么类型的消息。或者,您可以按原样使用自动参数创建,并检查TQuery.Params.Items的属性
另外,为了帮助对此进行排序,您可以尝试使用*或其中一个字段的名称替换count(*)以查看是否是问题的一部分。
答案 2 :(得分:0)
未使用BDE,但对于ADO查询,参数类型信息应由数据库填写。只有在设置了连接字符串(直接或通过TADOConnection对象)时才会出现这种情况。尝试删除ParamType和DataType调用,并确保已设置连接。
答案 3 :(得分:0)
好吧,看起来没有解决这个问题的方法。作为@TOndrej和@DavidG的指针,this QC issue从未被解决,似乎没有人知道如何解决它。
在我的情况下,我会放弃并告知我的上级我们不能再支持DB2,除非我们重写应用程序。无论如何,感谢所有试图帮助我的人。