0

これを機能させることはできますが、適切に行っていないように感じます。

これを初めて実行すると、意図したとおりに機能し、「thisField」に「doesntExist」が含まれる場所に新しい行が挿入されます

ただし、後で実行すると、主キー「thisField」に違反しているため、重複キーを挿入できないという実行時エラーが発生します。


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)
        {
            //...
        }
    }
}

AcceptChanges を移動したり、Begin/EndEdit 内で変更をカプセル化したりする試行錯誤を通じてそれを機能させることができたとしても、「同時実行違反」が発生し始め、変更が更新されず、失敗したことがわかります。影響を受ける 1 行の 0 行を更新します。

私が見逃している明らかなものはありますか?

4

1 に答える 1

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 を削除すると、「オブジェクトに重複キーを挿入できません」というメッセージが表示されるため、少なくとも解決策を見つけと感じています。しかし、それは解決策ではないように感じます。

これが誰かに役立つことを願っています。

于 2010-05-17T19:16:41.333 に答える