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

うーん、この問題の解決策はないようです。@TOndrej と @DavidG による指摘のとおり、この QC の問題は解決されておらず、回避方法を誰も知らないようです。

私の場合は、アプリケーションを書き直さない限り DB2 をサポートできないことをあきらめ、上司に伝えます。とにかく、私を助けようとしたすべての人に感謝します。

于 2013-08-23T17:09:27.503 に答える
0

TQuery.Params を使用して 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 に答える