1

Informixでテーブルを作成しました:

create table tab_unmrow
(
   area integer,
   rectangle row(
            x integer,
            y integer,
            length integer,
            width integer)
);

今、私がselect first 1 * from tab_unmrow使用するときdbaccess、これはうまくいきます。しかし、を使用するisqlと、次のエラーが発生します。

1820: Host variable type has been changed between fetches or puts.
Error in line 1

誰かがこれを修正する方法と、なぜこの問題が発生しているのかを提案できますか?

4

1 に答える 1

0

バグを IBM に報告する以外に、おそらく直接できることは何もありません。

最終的に、ESQL/C には CQ idsdb00247065 というバグがあり、エラー -1820 が発生します。LVARCHAR 変数のサイズが元のサイズに設定されていない限り、カーソルを再度開いたときに LVARCHAR 変数の SQL 記述子を再利用することはできません。サイズを変更してしまったのは ESQL/C 自体なので、イライラします。

アプリケーションが使用できる回避策があります。つまり、各 LVARCHAR の元のサイズを格納し、最初の FETCH の前 (実際には OPEN の後) に SQL 記述子でそのサイズを復元します。しかし、それには ISQL へのソースが必要です。Informix SQL ( isql) や DB-Access ( dbaccess) などのクライアント プログラムが複雑な型 (ROW 型など) を処理する方法は、値を LVARCHAR に変換します。

この修正には、(a) Informix ClientSDK (CSDK) の修正済みバージョンと、(b) 修正済み CSDK で構築された ISQL のバージョンが必要です。

短期的には、SQL スクリプトを処理するために ISQL の代わりに DB-Access を使用する必要があります。DB-Access は 20 年前に ISQL から分離されましたが、それ以来、独立して開発されてきました。

この診断に欠陥があるとすれば、それは構造ではなく SQL 記述子に適用されるということsqldaです (詳細を理解する必要はありません。動的 SQL を処理するメカニズムは 2 つしかなく、バグ レポートは 1 つに厳密に適用されます)。 、しかし、SQL記述子ではなくisql使用する可能性が高いため、他のものに適応できる場合があります)。sqldaただし、2 つの問題が密接に関連している可能性は非常に高いです。

于 2013-03-14T17:08:39.823 に答える