2010-06-13 37 views
2

我將C#與Oracle 11g連接起來。我有一個使用Oracle Data Adapter填充的DataTable。以Oracle序列作爲主鍵在數據綁定表格中添加新行

OracleDataAdapter da; 
DataTable dt = new DataTable(); 

da = new OracleDataAdapter("SELECT * FROM Author", con); 
da.Fill(dt); 

我有幾個文本框,我有數據綁定到數據表中的各行。

txtAuthorID.DataBindings.Add("Text", dt, "AUTHORID"); 
txtFirstName.DataBindings.Add("Text", dt, "FIRSTNAME"); 
txtLastName.DataBindings.Add("Text", dt, "LASTNAME"); 
txtAddress.DataBindings.Add("Text", dt, "ADDRESS"); 
txtTelephone.DataBindings.Add("Text", dt, "TELEPHONE"); 
txtEmailAddress.DataBindings.Add("Text", dt, "EMAIL"); 

我也有一個DataGridView下方的文本框,顯示DataTable的內容。

dgvAuthor.DataSource = dt; 

現在,當我想添加一個新行,我做

bm.AddNew(); 

其中BM中的Form_Load定義爲

而且畢竟當保存按鈕被點擊信息輸入和驗證,我做

this.BindingContext[dt].EndCurrentEdit(); 

try 
{ 
da.Update(dt); 
} 
catch (Exception ex) 
{ 
MessageBox.Show(ex.Message); 
} 

但是,當我通常向數據庫輸入一行(使用SQL Plus)時,問題就出現在這裏,我使用my_pk_sequence.nextval作爲主鍵。但我如何指定當我在這個方法中添加一個新行?

我發現這個例外 ORA-01400: cannot insert NULL into ("SYSMAN".AUTHOR.AUTHORID")這很明顯,因爲沒有指定主鍵。如何解決這個問題?提前感謝:)

回答

2

一個解決方案是創建觸發器,將自動生成插入值。
事情是這樣的:

CREATE OR REPLACE TRIGGER trigger_name 
    BEFORE INSERT ON SYSMAN.AUTHOR.AUTHORID 
    REFERENCING 
     OLD AS OLD 
     NEW AS NEW 
    FOR EACH ROW  
    BEGIN 
     SELECT my_sequence.NEXTVAL 
     INTO :NEW.AUTHORID 
     FROM DUAL; 
    END; 

編輯:

下面是來自維基百科報價在DUAL表:

DUAL表是默認存在於一個特殊的一個行的表所有Oracle數據庫安裝。

由於DUAL表是Oracle重要的是,這裏有一些資源,在那裏你可以學習一下吧:

+0

真棒:)一個問題,什麼是雙? :) – 2010-06-13 17:31:21

相關問題