DataTable.Update失败并引发DBConcurrencyException

时间:2015-06-09 19:41:07

标签: c# datatable sqlcommand sqldataadapter sqlcommandbuilder

我试图利用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;
}

当用户点击“更新表”时,会调用上述方法。按钮。
发生的事情是在我加入da.ContinueUpdateOnError = true之前try catch会抛出DBConcurrencyException给予Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.并且不会在表格中更新/插入任何记录。
在我添加da.ContinueUpdateOnError = true之后,da.Update()会继续而不会出现错误,但DataTable dt的第一行仍然不会更新,但是会插入dt的第二行。

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

1 个答案:

答案 0 :(得分:1)

仅在引用MSDN时出现此错误

  

尝试执行INSERT,UPDATE或DELETE语句   在零记录受影响。

获取此错误意味着自创建DataTable以来数据库已更改。

错误告诉你

  

UpdateCommand影响了预期的1条记录中的0条

尝试更新的其中一条记录不再存在或已更改,不再符合预期的签名。

供参考:DBConcurrencyExceptionDbDataAdapter.Update Methodlittle more explanation

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