1

ESQLスタイル(Informix API)呼び出しで記述されたサードパーティのInformixドライバーを維持しています。私は、TEXTフィールドの場合、INSERTが正常に機能し、UPDATEが失敗するバグに取り組んでいます。コードをステップスルーすると、sqlda構造をチェックして、バインドするかどうか、およびバインドする方法を確認していることがわかりました。sqli_describe_statementを呼び出した後、sqlda.sqld変数には2が含まれ、正しい数のバインドされたパラメーターが含まれます。この挿入呼び出しでは、パラメーターが正しく設定されているように見えますが、更新の場合、返される数値は0であり、パラメーター情報はありません( "UPDATE TESTTAB SET COLNAME =?WHERE OTHERCOLNAMEの1つのパラメーターの場合は1である必要があります)。 = 1 ")。

sqlda情報を使用して、INSERTに必要なロケーター構造を正しく設定しましたが、情報がないため、更新できません。デバッガーでそれを偽造し、更新のためにロケーターのセットアップコードを実行すると、正常に更新されます。

ステートメントは確かに正しいように見え、UPDATEバインドと同じ変数がINSERTに使用されています。さらに、sqli_prepは更新に問題はありません。describeの場合、sqsla.codeはさまざまな非負の数4と6を返します。これは、説明されているさまざまなタイプのステートメントを文書化されたもの(つまり、エラーコードではない)として表すため、明らかな問題はありません。

  1. この奇妙な振る舞いを引き起こす可能性のある、この前にコードをチェックインする必要がある他の何かがありますか(さまざまなクエリの特殊なケースの処理以外-そこには何もありません)

  2. ここで、ロケーターオブジェクトを作成し、行を見つけて、かかとを3回クリックして「IBMのような場所はない」と言う必要があるなど、TEXTフィールドのUPDATEを行う方法について基本的なことを見逃していますか?

これまでのところ、Google Fuはドキュメントにほとんど登場していませんが、その方法を示すドキュメントやサンプルを知っているなら、それもすばらしいことです。

4

1 に答える 1

1

これは、Informix の動作のあいまいな領域の 1 つです。DESCRIBE の動作は、出力パラメーターを記述することになっています (これは、DESCRIBE OUTPUT stmt INTO ... の省略形です)。入力パラメータを記述するには、代わりにDESCRIBE INPUT stmt INTO ... を使用します。

ただし、黎明期 (とにかく 1985 年) にまでさかのぼるさまざまな理由により、INSERT ステートメントは特別なケースの免除を受け、単純な DESCRIBE がその入力パラメーターを記述しました。UPDATE や DELETE (または、最近では MERGE) とは異なります。

したがって、あなたのコードはおそらく DESCRIBE INPUT と DESCRIBE OUTPUT が実現可能になる前に書かれたものです (それは約 2000±3 年でした)。原則として、指定された DESCRIBE ステートメントを使用すると、問題が解決するはずです。この動作を取得するには、ONCONFIG パラメータを設定する必要がある場合があります。

この機能が搭載されたことに感謝する一方で、「くそー、しばらくは使えないだろうな。機能のない古いバージョンがすべて廃止されるまでは」と思ったことも覚えています。私はそれが基本的に今起こっていると思います - 特に IDS 7.31 は現在廃止されており、実際に IDS 9.x バージョンも廃止されているため、IDS の利用可能なすべてのバージョンがこの機能をサポートしています。OnLine 5.20 - 少数派の関心事 - はまだサポートしておらず、今後もサポートしません。したがって、これを悪用するためにSQLCMDなどのプログラムを更新する方法を確認する必要があります。そこにあるコードには、私が「ビネット」と呼ぶものが含まれています。これらは、BYTE および TEXT BLOB の操作方法を説明する完全な小さなプログラムです。たとえば、UPDBLOB や APPBLOB が何らかの用途に使用される場合があります。

于 2010-07-10T02:25:50.690 に答える