0

DB Express と TClientDataSet を使用して DB グリッドに結合の結果を表示する Delphi XE2 で作成された DLL があります。他のアプリケーションで使用するためにエクスポートされたフォームを起動/表示する簡単な機能があります。FormActivate でクエリが実行され、グリッドにデータが入力されます。

別の Delphi XE2 アプリケーションからフォームを表示する関数を呼び出すと、すべて正常に実行されます。問題は見つかりませんでした。

しかし、別の Delphi 7 アプリケーションから同じ関数を呼び出すと、TClientDataSet が結合からフィールドを見つけられないというエラーが表示されます。

たとえば、データは次のように返されます。

[dbxds == TSQLDataSet
 cds == TClientDataSet]

dbxds.commandtext='select s.sfield1, s.sfield2, t.tfield1, t.tfield2 from s left join t on s.sfield1 = t.tfield1';

cds.Open;

cds.fieldByName(sfield2).visible:=false;//to hide from a dbgrid
cds.fieldByName(tfield2).visible:=false;//to hide from a dbgrid

XE2 から呼び出した場合は問題ありません。Delphi 7 から呼び出すと、最後の行(データベース グリッドからそのフィールドを非表示にするために使用)で次のエラーが発生します。

cds: Field 'tfield2' not found 

最初の行は問題ありませんが、「t」フィールドが最初に取得されるようにクエリの順序を切り替えると (「from t left join s」)、代わりに「s」フィールドでエラーが発生します。

非互換性の原因について何か考えはありますか?

ありがとう!

4

1 に答える 1

0

わかりました、私は何か奇妙なことに気づき、これに対する答えを得る道に私を置きました.

たまたま、どちらのテーブルでも、非表示にするためにアクセスしようとしていたフィールドが「tinyint(1)」型でした。int/varchar 型などのフィールドを非表示にしようとしても、エラーは発生しませんでした。

「tinyint(1)」フィールドを「int(1)」に交換したところ、正常に動作しました。

なぜこれが起こったのかわかりませんが、私はそれを見つけてよかったです.もし他の誰かがこの問題に遭遇した場合、これが彼らの質問にも答えてくれることを願っています.

于 2012-09-17T14:32:17.897 に答える