이 작업을 수행 할 수는 있지만 제대로 수행하지 못하는 것 같습니다. 나는 그것을 이후의 시간을 실행하면 "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 개를 갱신하지 못했다고합니다.
뭔가 미친 내가 분명히있어?