【问题标题】:Delphi - Oracle RowID ignored with dbGO/ADODelphi - Oracle RowID 被 dbGO/ADO 忽略
【发布时间】:2021-04-19 12:34:58
【问题描述】:

Delphi Rio - 我使用 Oracle 配置了 dbGO/ADO(使用 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 是完全有效的。

为了让 OleDbDataAdapter.Update() 方法正确更新 Oracle 对 DataTable 所做的更改,DataTable 必须包含 数据库表的主键。如果数据库表没有 包含主键时,必须显式选择 ROWID 填充 DataTable,以便 ROWID 可用于唯一 更新数据库中的一行时识别一行。

有没有办法解决这个问题?如何在 dbGo 中使用 RowID? (是的,我知道使用 RowID 会出现问题……但这是单个用户,本地数据库。)

【问题讨论】:

    标签: oracle delphi ado


    【解决方案1】:

    看起来它使用 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';
    

    【讨论】:

    • 很好的尝试,但不幸的是它没有帮助....
    • @user1009073 好的,请尝试使用更新答案中的 to_char
    • 还是不行... Delphi 抛出一个 Oracle 错误。 ORA-00932: 不一致的数据类型: 预期的 NUMBER 得到了 ROWID。我将 SQL 调整为此...从 ACCOUNTS_SI 中选择 RowIDtoChar(ROWID) RID、REGISTRY_ID、TERRITORY_ID、ACCOUNT_NAME 并且它可以工作。更新答案,我会接受。
    • @user1009073 谢谢,完成(忘了那个功能)
    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多