1

これは私が以前に尋ねた質問の拡張です:C#:Informixを使用して挿入された最後の行のID番号を取得するにはどうすればよいですか?

.NET Informixドライバーを使用してinformixデータベースにレコードを挿入するコードをC#で記述しています。最後の挿入のIDを取得できましたが、一部のテーブルでは「serial」属性が使用されていません。次のようなコマンドを探していましたが、idではなくrowidを取得しました。

SELECT DBINFO ('sqlca.sqlerrd1') FROM systables WHERE tabid = 1;

そして、はい、私はそれが一定ではないので、rowidでの作業は危険であることを認識しています。ただし、ROWIDが再配置されるなどの方法でテーブルが変更された場合は、アプリケーションでクライアントアプリにデータのリセットを強制させる予定です。

4

1 に答える 1

1

ROWIDの問題の1つは、それが4バイトの数量であるが、フラグメント化されたテーブルで使用される値が8バイトの数量(通常はFRAGIDとROWID)であるが、InformixがFRAGIDを公開したことがないことです。

理論的には、SQLCAデータ構造はsqlca.sqlerrd[5]要素内のROWIDを報告します(0からのCスタイルのインデックス付けを想定してsqlca.sqlerrd[6]います。1からインデックス付けするのはInformix 4GLです)。DBINFOで機能するものがあるとすれば、それは可能DBINFO('sqlca.sqlerrd5')ですが、次のようになります。

SQL -728: Unknown first argument of dbinfo(sqlca.sqlerrd5).

したがって、DBINFOを使用した間接的なアプローチは有効ではありません。すぐに利用できるESQL/Cではsqlca、次の情報も利用できます。

SQL[739]: begin;
BEGIN WORK: Rows processed = 0
SQL[740]: create table p(q integer);
CREATE TABLE: Rows processed = 0
SQL[741]: insert into p values(1);
INSERT:  Rows processed = 1, Last ROWID = 257
SQL[742]: select dbinfo('sqlca.sqlerrd5') from dual;
SQL -728: Unknown first argument of dbinfo(sqlca.sqlerrd5).
SQLSTATE: IX000 at /dev/stdin:4
SQL[743]: 

私はC#または.NETドライバーのユーザーではないため、情報を取得するためのバックドアメカニズムがあるかどうかはわかりません。ODBCでも、それを実現するためのフロントドアメカニズムがない場合がありますが、Cコードにドロップして、グローバルデータ構造を簡単に読み取ることができます。

#include <sqlca.h>
#include <ifxtypes.h>
int4 get_sqlca_sqlerrd5(void)
{
    return sqlca.sqlerrd[5];
}

あるいは:

int4 get_sqlca_sqlerrdN(int N)
{
    if (N >= 0 && N <= 5)
        return sqlca.sqlerrd[N];
    else
        return -22;  /* errno 22 (EINVAL): Invalid argument */
}

C#がCで記述されたDLLにアクセスできる場合は、それをパッケージ化できます。

それ以外の場合、データの行を識別する承認された方法は、行の主キー(または代替キーまたは候補キーと呼ばれることもある他の一意の識別子)を使用することです。行の主キーまたはその他の一意の識別子がない場合は、自分の生活を困難にしていることになります。それが複合キーである場合、それは「機能します」が、不便である可能性があります。おそらく、SERIAL列(またはBIGSERIAL列)をテーブルに追加することを検討する必要があります。

次を使用できます。

SELECT ROWID
  FROM TargetTable
 WHERE PK_Column1 = <value1> AND PK_Column2 = <value2>

または、行を正確に識別できると仮定して、ROWIDを取得するのと同様のもの。

悲惨な状況では、断片化されたテーブルに物理ROWID列を追加するメカニズムがあります(通常、これは仮想列です)。次に、上記のクエリを使用します。これはお勧めしませんが、オプションがあります。

于 2010-11-27T15:29:06.867 に答える