DataTable.Update 失败并抛出 DBConcurrencyException

DataTable.Update Fails and Throws DBConcurrencyException

我正在尝试利用 DataTable.Update 方法来更新 SQL 数据源。下面是执行更新的方法的代码。

string connString = "SQL connection string...this works.";
string sqlSelect = "SELECT Payment, Amount, Date, Month, StartDate, EndDate, FROM Payment";

private void updateDataSource(DataTable dt) {
    SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connString);
    SqlCommandBuilder cb = new SqlCommandBuilder(da);
    int result = 0; // store the result of dt.Update

    // copy over any rows from dt that have a payment date
    DataTable temp = dt.Clone(); 
    foreach (DataRow dr in dt.Rows) {
        if (dr.ItemArray[5].ToString() != "") // if payment date is not empty
            temp.ImportRow(dr);
    }

    da.ContinueUpdateOnError = true; // this forces an insert but does not update any other records

    try {
        result = da.Update(temp);
    } catch (DBConcurrencyException dbce) {
        alertUser(
            @"There was an error updating the database.\n" +
            dbce.Message + @"\n" +
            @"The payment type id for the row was: " + dbce.Row.ItemArray[1] + @"\n" +
            @"There were " + temp.Rows.Count + @" rows in the table to be updated.\n");
    }

    if (result == temp.Rows.Count) {
        alertUser("Successful update."); // alert the user
        btnSearchCancel_Click(null, null);
    }

    // store updated data in session variable to store data between posts to server
    Session["gv"] = dt;
}

当用户单击 'Update Table' 按钮时调用上述方法。
发生的事情是在我包含 da.ContinueUpdateOnError = true 之前 try catch 会抛出 DBConcurrencyException 给出 Concurrency violation: the UpdateCommand affected 0 of the expected 1 records. 并且 table 中没有记录 updated/inserted .
在我添加 da.ContinueUpdateOnError = true 之后,da.Update() 将继续而不会出现错误,但是 DataTable dt 的第一行仍不会更新,但是,将插入 dt 的第二行。

更奇怪的是,当我调用更新传递一个 table ~20 行时,更新执行完美,更新 2 或 3 行并插入 2 或 3 行。如果我调用更新传递 2 行的 table,则会抛出异常。两个不同的 table 具有相同的结构。

这个错误只发生在引用 MSDN

的时候

An attempt to execute an INSERT, UPDATE, or DELETE statement resulted in zero records affected.

得到这个错误意味着数据库在创建DataTable后发生了变化。

错误告诉你

the UpdateCommand affected 0 of the expected 1 records

尝试更新的记录之一已不存在或已更改且不再与预期签名匹配。

供参考:DBConcurrencyException and DbDataAdapter.Update Method, a little more explanation.

似乎在创建 DataTable 后可能有一些其他代码正在更改数据库,或者您 运行 在生产数据库上并且其他用户正在进行更改。