2011-11-23 56 views
0

我試圖更新一些現有的代碼,應該通過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'之前不應該有冒號嗎? –

回答

3

看來您的第一個問題並不在於Oracle數據庫。 Oracle中沒有這樣的「自動增量」列。您確定該消息來自Oracle數據庫嗎?

對於Oracle,您應該能夠爲主鍵插入提供任何虛擬值,並且觸發器將覆蓋它。

您提供的描述中也沒有任何內容會阻止您在Oracle中更新此值(因爲您的觸發器僅在插入時),除非您擁有對該密鑰的外鍵引用。

+0

不,Oracle不支持AutoIncrement,但我需要一個「我不需要填充此字段,Oracle會爲我做」的等價物,所以DataTable不會拋出異常。你是對的,我可以提供一個虛擬值,但在一般情況下,我不知道什麼樣的虛擬值是有效的...... -1? 0?......我只知道觸發器在我的特定測試數據庫中的作用。如果它是生成String或Guid的觸發器,那麼我該如何使用? :S – Ian

+0

設置AllowDBNull顯然是一種更有用的方法,而不是試圖適應自動編號。 – Ian