2010-05-14 8 views
0

이 작업을 수행 할 수는 있지만 제대로 수행하지 못하는 것 같습니다. 나는 그것을 이후의 시간을 실행하면 "thisField는"그러나CommandBuilder 및 SqlTransaction을 사용하여 행을 삽입/업데이트합니다.

을 "doesntExist"를 포함하는 경우 의도 한대로

이 처음 실행, 그것은 작동하고, 새 행을 삽입, 나는 런타임 오류 기본 키인 "thisField"를 위반할 때 중복 키를 삽입 할 수 없습니다. 내가 주변에 대해 AcceptChanges를 이동하거나 내에서 변경을 캡슐화의 시행 착오를 통해 작업하는 /지며 EndEdit 시작 것을 얻을 수있을 때


static void Main(string[] args) 
{   
    using(var sqlConn = new SqlConnection(connString)) 
    { 
     sqlConn.Open(); 
     var dt = new DataTable(); 

     var sqlda = new SqlDataAdapter("SELECT * FROM table WHERE thisField ='doesntExist'", sqlConn); 
     sqlda.Fill(dt); 

     DataRow dr = dt.NewRow(); 

     dr["thisField"] = "doesntExist"; //Primary key 

     dt.Rows.Add(dr); 

     //dt.AcceptChanges(); //I thought this may fix the problem. It didn't. 

     var sqlTrans = sqlConn.BeginTransaction(); 

     try 
     { 
      sqlda.SelectCommand = new SqlCommand("SELECT * FROM table WITH (HOLDLOCK, ROWLOCK) WHERE thisField = 'doesntExist'", sqlConn, sqlTrans); 

      SqlCommandBuilder sqlCb = new SqlCommandBuilder(sqlda); 

      sqlda.InsertCommand = sqlCb.GetInsertCommand(); 
      sqlda.InsertCommand.Transaction = sqlTrans; 

      sqlda.DeleteCommand = sqlCb.GetDeleteCommand(); 
      sqlda.DeleteCommand.Transaction = sqlTrans; 

      sqlda.UpdateCommand = sqlCb.GetUpdateCommand(); 
      sqlda.UpdateCommand.Transaction = sqlTrans; 

      sqlda.Update(dt); 

      sqlTrans.Commit(); 
     } 
     catch (Exception) 
     { 
      //... 
     } 
    } 
}

는해도, 그때는 변경 사항을 업데이트하지 않습니다있는 "동시성 위반"을 경험하기 시작 오히려 영향을받은 행 0 개 중 0 개를 갱신하지 못했다고합니다.

뭔가 미친 내가 분명히있어?

답변

1

데이터 테이블을 채운 다음 수동으로 행을 삭제하여 문제를 해결할 수있었습니다. dt.Clear()을 사용할 수 없으므로 중복 기본 키가있는 레코드를 삽입하려고 시도하여 예외가 발생합니다.


sqladapter.Fill(dt); 

foreach(DataRow d in dt.Rows) 
    d.Delete(); 

DataRow dr = dt.NewRow(); 

dr.BeginEdit(); 
//update dr 
dr.EndEdit(); 

dt.Rows.Add(dr);

위의 내용을 따르면 성공적으로 새 행을 삽입하고 기존 행을 업데이트 할 수 있습니다. foreach를 제거하면 "객체에 중복 키를 삽입 할 수 없습니다"라는 메시지가 표시되므로 적어도 을 찾았습니다. 솔루션입니다. 그래도 나는 솔루션이 아닌 것처럼 느낍니다.

희망이 있으면 도움이됩니다.