2009-11-21 84 views
1

我有一個集合C#的DataTable:添加新行使用自動遞增場

List<Employee> employees; 

我使用一個DataTable,並加載所有記錄(從MDB表)時Form1.Loads拋出錯誤,而這些記錄添加到列表(收藏),所以我在內存中與他們合作。

現在,當我添加一個新員工集合,我也應該將其添加到MDB表...所以我做的:

DataRow rowemployee = Program.tblEmployee.NewRow(); 
rowemployee["name"] = tb_Name.Text; 
rowemployee["address"] = tb_Address.Text; 
//...all the other fields 
Program.tblEmployee.AddRow(rowemployee); 

的IDE拋出關於「ID」列中的錯誤必須沒有空值或不能爲空。
由於mdb表有一個id列,輸入number,autoinc,我應該如何修復Employee類和DataTable/Collections方法,這樣在添加新行時id列被「忽略」

謝謝

回答

2

第一個問題是,雖然id列是自動遞增的數據庫,與之對應的DataColumn對象在DataTable沒有設置爲自動遞增。您需要設置其AutoIncrement,AutoIncrementSeedAutoIncrementStep屬性。

一旦你這樣做,你會遇到第二個問題,那就是你有兩個不同的自動增量種子:數據庫中的那個和你的DataTable中的那個。即使這兩個種子以相同的值開始,它們對於不同步也是微不足道的:爲您的DataTable添加一行併爲您的數據庫表添加一行,現在您有兩個具有相同ID的不同行。

這是一個常見問題,其常見解決方案是對添加到DataTable的行有不同的編號順序。通常這是通過將種子設置爲0並將步驟設置爲-1來完成的,以便您添加到DataTable的所有行都具有小於0的ID(這當然假定數據庫中的所有ID都大於 0.)這意味着數據庫中添加的行與添加到DataTable的行之間不會有ID衝突的機會。

然後,當你真正從DataTable更新數據庫,插入行後進入數據庫及其真正 ID被分配,您更改DataRow的ID爲正確的值。如果該行作爲父項參與數據關係,則DataColumn必須設置級聯更新,以便將父行中的ID從其臨時本地值更改爲其永久值也會更改相關子行中的ID。

使用鍵入數據集和表格適配器的衆多原因之一是所有這些工作都是自動完成的。但如果你不使用表格適配器,你必須自己做。這裏有一個很好的例子the ADO documentation

+0

OMFG ...這是地獄! !我無法做所有這些事情只是爲了能夠在表中添加記錄而不會出現表 中的ID字段問題我想我會使用自動方式 – Enrique 2009-11-23 12:26:14

+0

這真的不是那麼糟糕。只需要執行三件事 - 正確設置自動遞增,在插入後更新ID,並將DataRelations設置爲級聯更新 - 如果您的表參與關係,則只需執行第三項操作。 – 2009-11-23 17:30:25

0

您是如何設置表格的?

此代碼來自DataRow.ItemArray Property MSDN page,它說明如何使用AutoIncrement屬性。

private DataTable MakeTableWithAutoIncrement() 
{ 
    // Make a table with one AutoIncrement column. 
    DataTable table = new DataTable("table"); 
    DataColumn idColumn = new DataColumn("id", 
     Type.GetType("System.Int32")); 
    idColumn.AutoIncrement = true; 
    idColumn.AutoIncrementSeed = 10; 
    table.Columns.Add(idColumn); 

    DataColumn firstNameColumn = new DataColumn("Item", 
     Type.GetType("System.String")); 
    table.Columns.Add(firstNameColumn); 
    return table; 
} 
+0

我的mdb文件只有一個表「Employee」,它有一些字段,並且還有一個主鍵設置爲autonumeric(autoinc)。當我將一些數據添加到我的List <>中時,我必須在mdb中反映這種變化,但是它不允許我發佈沒有id字段的新記錄... – Enrique 2009-11-23 12:19:20