Delphi - Oracle RowID 被 dbGO/ADO 忽略

Delphi - Oracle RowID ignored with dbGO/ADO

Delphi Rio - 我已经 dbGO/ADO 配置了 Oracle(使用 Oracle 的连接器,而不是 Microsoft 的)。我正在处理一个简单的查询。

mySQL := 'select REGISTRY_ID, TERRITORY_ID, ACCOUNT_NAME from ACCOUNTS_SI';

ADO_Q1.Close;
ADO_Q1.SQL.Clear;
ADO_Q1.SQL.Add(mySQL);
ADO_Q1.Open;

ShowMessage(IntToStr(ADO_Q1.FieldList.Count));

这完全符合预期,消息弹出窗口显示 3。如果我将 ROWID 添加为一列,它似乎被完全忽略了。下面的查询运行,但仍然显示 3 列。

mySQL := 'select ROWID, REGISTRY_ID, TERRITORY_ID, ACCOUNT_NAME from ACCOUNTS_SI';

我什至试过重命名它。

mySQL := 'select ROWID as MYKEY_ID, REGISTRY_ID, TERRITORY_ID, ACCOUNT_NAME from ACCOUNTS_SI';

ROWID 作为一列,虽然完全合法,但正在被过滤掉。

当我查看 Oracle 的文档时,它似乎表明 RowID 是完全有效的。

In order for the OleDbDataAdapter.Update() method to properly update Oracle with changes made in the DataTable, the DataTable must contain a primary key of a database table. If the database table does not contain a primary key, the ROWID must be selected explicitly when populating the DataTable, so that the ROWID can be used to uniquely identify a row when updating a row in the database.

有办法解决这个问题吗?如何将 RowID 与 dbGo 一起使用? (是的,我知道使用 RowID 的问题...但这是单个用户,本地数据库。)

看起来它使用 ROWID 用于游标导航等内部用途,因此尝试添加 2 个 ROWID 列并将其中一个包含在嵌套子查询中:

mySQL := 'select RID, REGISTRY_ID, TERRITORY_ID, ACCOUNT_NAME from (select ROWID, ROWID as RID, s.* from ACCOUNTS_SI s';

更新(因为前一个没有帮助) 另一种变体:

mySQL := 'select RowIDtoChar(ROWID) RID, REGISTRY_ID, TERRITORY_ID, ACCOUNT_NAME from ACCOUNTS_SI';