0

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

我正在尝试执行一个使用 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,调用PrepareUnPrepare,但似乎没有任何效果。有任何想法吗?

重要提示:我直接通过 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".
4

4 回答 4

1

Delphi 7的缺陷报告http://qc.embarcadero.com/wc/qcmain.aspx?d=12905似乎几乎相同。我唯一的想法是,如果将 :name 替换为问号会发生什么。"?" 在 db2 Java 参数中使用 ? 您将需要使用参数作为位置

于 2013-08-22T09:45:12.927 回答
0

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

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

于 2013-08-22T00:11:05.073 回答
0

没有使用BDE,但是使用ADO查询参数类型信息应该由数据库填写。这仅在已设置连接字符串(直接或通过 TADOConnection 对象)时发生。尝试删除 ParamType 和 DataType 调用并确保已设置连接。

于 2013-08-23T09:44:26.440 回答
0

好吧,看起来这个问题没有解决方案。作为@TOndrej 和@DavidG 的指针,这个QC 问题从未得到解决,似乎没有人知道如何解决它。

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

于 2013-08-23T17:09:27.503 回答