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列を追加するメカニズムがあります(通常、これは仮想列です)。次に、上記のクエリを使用します。これはお勧めしませんが、オプションがあります。