2011-09-03 6 views
0

私は、アクセスデータベースから作成されたoledbdataadapterで満たされたデータテーブルiでいくつかの作業を行っていました。そして私は、このエラーにつまずい:自動番号とdbnull例外付きデータテーブル

は私の表は、この構造を有していることが判明: ID - >オートナンバー型(PK)

lazos_>テキスト

Asociaciones->テキスト

とするとき私はすべての正しい値で問題なく、すべての値を渡す私のデータテーブルを埋める。私は "行を挿入する"部分に示されているような新しい行を挿入します。

これは私のpkが行の作成に "autonumber"を据え付けるが、明らかにそれはやっていない。なぜなら、私が行を動かすときに、 "無効なキャスト例外"が出る。

私はカラムにid値を挿入する必要がありますが、私のデータベースに自分のdtを更新するとエラーが発生します。なぜなら、最後に作成された行を知る方法がないからです。またはdo i?

たとえば、最後のIDは50ですが、以前はID「51」のレコードを作成していましたが、それを削除しました.dt情報に基づいて51を挿入すると、それは間違いの権利を与えるでしょうか?

//// 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

私はかつて似たような問題があった。あなたがする必要があるのは、テーブルにそれを挿入すると、がこの列の新しいID @@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

@ジョーキン:私は助けてうれしいです。答えとしてマークしてください;) – Janez