带有 Oracle 触发键列的 ODBC

Posted

技术标签:

【中文标题】带有 Oracle 触发键列的 ODBC【英文标题】:ODBC with Oracle Trigger Key Column 【发布时间】:2011-11-23 17:19:53 【问题描述】:

我正在尝试更新一些现有代码,这些代码应该通过 ODBC 将数据写入各种数据库(SQL、Access、Oracle),但我在使用 Oracle 时遇到了一些问题,正在寻找任何建议。

我已经使用触发器设置了我的 Oracle 数据库(在线基础教程,我想支持)。

CREATE TABLE TABLE1 (
    RECORDID NUMBER      NOT NULL PRIMARY KEY,
    ID       VARCHAR(40) NULL,
    COUNT    NUMBER      NULL

);
GO

CREATE SEQUENCE TABLE1_SEQ 
GO

CREATE or REPLACE TRIGGER TABLE1_TRG
BEFORE INSERT ON TABLE1
FOR EACH ROW
    WHEN (new.RECORDID IS NULL)
    BEGIN
        SELECT TABLE1_SEQ.nextval 
        INTO :new.RECORDID 
        FROM dual;
    end;
GO

然后我使用SELECT * FROM TABLE1 填充数据表。第一个问题是这个 DataTable 不知道 RecordId 列是自动生成的。如果我的表中有数据,那么我无法更改它,因为我收到错误

无法更改类型为“Double”的 DataColumn 的 AutoIncrement 有数据。

如果我继续忽略这一点,那么我很快就会陷入困境。如果我创建一个新的 DataRow 并尝试插入它,我无法将 RecordID 设置为 DBNull.Value,因为它抱怨该列必须为非空 (NoNullAllowedException)。但是,我自己无法生成值,因为我不知道我应该真正使用什么值,并且不想通过使用下一个可用值来搞砸触发器。

关于如何插入数据而不引起 ODBC 抱怨的任何建议?

【问题讨论】:

WHEN子句中'new'前不应该有冒号吗? 【参考方案1】:

您的第一个问题似乎不是与 Oracle 数据库有关。 Oracle 中没有“自动增量”列。您确定该消息来自 Oracle 数据库吗?

使用 Oracle,您应该能够在插入时为主键提供任何虚拟值,触发器将覆盖它。

您提供的描述中也没有任何内容会阻止您在 Oracle 中更新此值(因为您的触发器仅在插入时),除非您有对该键的外键引用。

【讨论】:

不,Oracle 不支持 AutoIncrement,但我需要“我不需要填充此字段,Oracle 会为我完成”的等价物,因此 DataTable 不会抛出异常.你是对的,我可以提供一个虚拟值,但在一般情况下,我不知道什么虚拟值是有效的...... -1? 0?...我只知道触发器在我非常具体的测试数据库中的作用。如果它是生成 String 或 Guid 的触发器,那我该使用什么? :S 设置 AllowDBNull 显然是一种更有用的方法,而不是试图适应自动编号。

以上是关于带有 Oracle 触发键列的 ODBC的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何将自动增量添加到现有表中

oracle触发器记录字段变更

oracle触发器在表中插入新行时更新新的视图行

触发额外查询以获取序列下一个值-spring JPA

具有包含性列的索引

带有到 odbc 数据库的列的文本文件