带有 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的主要内容,如果未能解决你的问题,请参考以下文章