簡體   English   中英

Informix:如何獲取最后一個insert語句的rowid

[英]Informix: How to get the rowid of the last insert statement

這是我之前提出的問題的擴展: C#:如何獲取使用Informix插入的最后一行的ID號

我正在用C#編寫一些代碼,以使用.NET Informix驅動程序將記錄插入到notifyix數據庫中。 我能夠獲取最后一次插入的ID,但是在某些表中未使用'serial'屬性。 我在尋找與以下類似的命令,但要獲取rowid而不是id。

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

是的,我的確意識到使用rowid很危險,因為它不是恆定的。 但是,我計划讓我的應用程序強制客戶端應用程序,如果以重新排列rowid或類似方式更改表的方式來重置數據。

ROWID的一個問題是它是4字節的數量,但在碎片表上使用的值是8字節的數量(名義上為FRAGID和ROWID),但是Informix從未公開過FRAGID。

從理論上講,SQLCA數據結構在sqlca.sqlerrd[5]元素中報告ROWID(假定C風格的索引從0開始;在Informix 4GL中是sqlca.sqlerrd[6] ,從1開始進行索引)。 如果有什么要使用DBINFO,它將是DBINFO('sqlca.sqlerrd5') ,但是我得到:

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

因此,使用DBINFO的間接方法未啟用。 在容易使用sqlca ESQL / C中,該信息也可用:

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列添加到碎片表中(通常是虛擬列)。 然后,您將使用上面的查詢。 不建議這樣做,但可以使用該選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM