2011-09-03 40 views
0

我正在做一些數據表的工作,我充滿了從訪問數據庫製作的oledbdataadapter。我偶然發現了這個錯誤:自動編號和數據表與dbnull異常

原來,我的表中有這樣的結構: ID - >自動編號(PK)

lazos_>文本

Asociaciones->文本

當我填充我的數據表中的所有值傳遞給它沒有任何問題與所有正確的值。我插入一個像「插入行」部分所示的新行。

我這樣做是因爲我的pk會在行創建時插入「自動編號」,但顯然它沒有這樣做,因爲當我循環trought行時,我得到一個「無效的轉換異常」與一個對象無法投射DBNull其他類型。「

我可以插入一個id值的列,但是當我更新我的dt到我的數據庫將不會創建一個錯誤,因爲我沒有辦法知道這是最後一行創建?,或者我?

例如讓我說我的數據表中的最後一個ID是50,但在數據庫y先前做了一個ID爲「51」的記錄,但隨後抹去它,如果我插入51基於我的dt信息,它會給出錯誤的權利?

//// INSERT ROW 
    DataRow newRow = Tabla_Cods_Proy.NewRow(); 
    newRow["Lazos"] = textBox1.Text ; 
    newRow["Asociaciones"] = textBox2.Text; 
    Tabla_Cods_Proy.Rows.Add(newRow); 
    MessageBox.Show("Enhorabuena!"); 


//CHECK ID's    
    for (int i = 0; i < Tabla_Cods_Proy.Rows.Count; i++) 
    { 
     if (Tabla_Cods_Proy.Rows[i].RowState != DataRowState.Deleted) 
     { 
      if (Tabla_Cods_Proy.Rows[i]["Lazos_asociados"].ToString() == "") 
      { 

       listBox7.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Cliente"]); 
       listBox8.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Inelectra"]); 
       ID_Cods_Proy_Sin_Asociar.Add(Convert.ToInt32(Tabla_Cods_Proy.Rows[i]["ID"])); 

      } 
      else 
      { 
       listBox3.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Cliente"]); 
       listBox4.Items.Add(Tabla_Cods_Proy.Rows[i]["Cod_Inelectra"]); 
       ID_Cods_Proy_Asociados.Add(Convert.ToInt32(Tabla_Cods_Proy.Rows[i]["ID"])); 
      } 
     } 

回答

0

我曾經有過類似的問題。你需要做的是當你將插入表後,你可以檢索該列的新標識@@IDENTITY。您可以通過使用RowUpdated事件來完成此操作。

這裏是MSDN page簡單的例子(類同的情況下,看到頁面底部):

public static void Main() 
    { 
     //...connecting to access db and getting data to datatable... 
     // ... 
     // Adding a new row to datatable. 
     DataRow newRow = catDS.Tables["Categories"].NewRow(); 
     newRow["CategoryName"] = "New Category"; 
     catDS.Tables["Categories"].Rows.Add(newRow); 

     // Include an event to fill in the Autonumber value. 
     catDA.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated); 

    } 

    protected static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args) 
    { 
     // Include a variable and a command to retrieve the identity value from the Access database. 
     int newID = 0; 
     OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn); 

     if (args.StatementType == StatementType.Insert) 
     { 
      // Retrieve the identity value and store it in the CategoryID column. 
      newID = (int)idCMD.ExecuteScalar(); 
      args.Row["CategoryID"] = newID; 
     } 
    } 
+0

感謝的人,它的工作! – Joaquin

+0

@Joaquin:很高興我能幫上忙。標記爲答案;) – Janez