ODBC与Oracle触发键列

问题描述:

我试图更新一些现有的代码,应该通过ODBC将数据写入各种数据库(SQL,Access,Oracle),但我遇到了一些Oracle问题,我正在寻找任何建议。ODBC与Oracle触发键列

我已经使用Trigger(在线基础教程,我希望支持)设置我的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。第一个问题是这个DataTable不知道RecordId列是自动生成的。如果我在表中有数据,那么,因为我得到一个错误

不能与type“双师型”改变的DataColumn的自动递增一旦 有数据我不能改变它。

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

有关如何在没有ODBC抱怨的情况下插入数据的任何建议?

+0

在WHEN子句中'new'之前不应该有冒号吗? –

看来您的第一个问题并不在于Oracle数据库。 Oracle中没有这样的“自动增量”列。您确定该消息来自Oracle数据库吗?

对于Oracle,您应该能够为主键插入提供任何虚拟值,并且触发器将覆盖它。

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

+0

不,Oracle不支持AutoIncrement,但我需要一个“我不需要填充此字段,Oracle会为我做”的等价物,所以DataTable不会抛出异常。你是对的,我可以提供一个虚拟值,但在一般情况下,我不知道什么样的虚拟值是有效的...... -1? 0?......我只知道触发器在我的特定测试数据库中的作用。如果它是生成String或Guid的触发器,那么我该如何使用? :S – Ian

+0

设置AllowDBNull显然是一种更有用的方法,而不是试图适应自动编号。 – Ian