Един проблем с ROWID е, че това е 4-байтово количество, но стойността, използвана на фрагментирана таблица, е 8-байтово количество (номинално FRAGID и ROWID), но Informix никога не е излагал FRAGID.
На теория структурата на данните SQLCA отчита ROWID в елемента sqlca.sqlerrd[5]
(приемайки индексиране в стил C от 0; това е sqlca.sqlerrd[6]
в Informix 4GL, което индексира от 1). Ако нещо щеше да работи с 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# има достъп до DLL, написани на C, можете да го пакетирате.
В противен случай одобреният начин за идентифициране на редове от данни е чрез първичния ключ (или всеки друг уникален идентификатор, понякога известен като алтернативен ключ или ключ кандидат) за реда. Ако нямате първичен ключ или друг уникален идентификатор за реда, затруднявате живота си. Ако е сложен ключ, това „работи“, но може да е неудобно. Може би трябва да помислите за добавяне на колона SERIAL (или колона BIGSERIAL) към таблицата.
Можеш да използваш:
SELECT ROWID
FROM TargetTable
WHERE PK_Column1 = <value1> AND PK_Column2 = <value2>
или нещо подобно, за да получите ROWID, ако приемете, че можете да идентифицирате точно реда.
При дире стрейт има механизъм за добавяне на физическа колона ROWID към фрагментирана таблица (обикновено това е виртуална колона). След това ще използвате заявката по-горе. Това не е препоръчително, но опцията е налице.
person
Jonathan Leffler
schedule
27.11.2010