2011-09-03 4 views
0

나는 액세스 데이터베이스로 만든 oledbdataadapter로 채워진 데이터 테이블에 대한 작업을하고있었습니다.자동 번호 및 dbnull 예외가있는 데이터 테이블

내 표는이 구조를 가지고 있음을 밝혀 : 그리고 난이 오류가 우연히 ID - 텍스트>> 일련 번호 (PK)

lazos_을

Asociaciones-> 텍스트

때 내 모든 datatable 채우기 모든 값을 모든 올바른 값으로 문제없이 전달합니다. "행 삽입"부분에 표시된 것과 같은 새 행을 삽입합니다.

내 pk가 행 생성시 "autonumber"를 시작한다는 것을 알았지 만 실제로 행을 순환시킬 때 "잘못된 캐스트 예외"가 발생하여 객체를 캐스팅 할 수 없기 때문에 분명히하지 않습니다. 다른 유형의 DBNull "

열에 id 값을 삽입해야하지만 데이터베이스에 내 dt를 업데이트 할 때 오류가 발생합니다. 마지막으로 작성된 행을 알 수 없기 때문입니다. 또는 어떻게합니까?

예를 들어, 내 IDT를 기반으로 51을 삽입 한 경우 이전에 ID가 "51"인 레코드를 만든 데이터베이스 y에서 마지막 데이터 ID가 50인데, 그것은 바로 오류를 줄 것인가?

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