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';
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';