得到确切的违规字段:并发冲突:UpdateCommand影响了预期的1条记录中的0条

时间:2017-07-11 13:35:19

标签: debugging exception concurrency ado.net

在更新命令中,我遇到上述错误。

我试图注销所有内容,但我找不到导致问题的字段。我确实将“myoriginal”与通过SSMS从数据库中获得的值进行了比较,结果完全相同。

如何找到导致并发错误的确切字段?

我的代码用于查明错误:

public virtual int Update(global::System.Data.DataRow[] dataRows)
{
  try
  {
    return this.Adapter.Update(dataRows);
  }
  catch (System.Exception ex)
  {
    var msg = "my little exception, " + dataRows.Length + " rows attempted to update";
    foreach (var row in dataRows)
    {
      msg += "row has errors: " + row.HasErrors;
      if (row.HasErrors)
      {
        msg += " descr " +  row.RowError + System.Environment.NewLine;
        foreach (var col in row.GetColumnsInError())
          msg += " col " + row.GetColumnError(col.ColumnName);
      }
      {
        msg += "mynewone";
        msg += System.Environment.NewLine;
        var columns = row.Table.Columns;
        foreach (System.Data.DataColumn col in columns)
          msg += col.ColumnName + "->" + row[col.ColumnName];
        msg += System.Environment.NewLine;

        msg += "myoriginal";
        msg += System.Environment.NewLine;

        foreach (System.Data.DataColumn col in columns)
          msg += col.ColumnName + "->" + row[col.ColumnName, System.Data.DataRowVersion.Original];
        msg += System.Environment.NewLine;

        msg += "theend";
        msg += System.Environment.NewLine;
      }
    }
    throw new System.Exception(msg, ex);
  }
}

第一部分(row.HasErrors) - 我希望详细说明出错的地方 - 不会产生任何输出。

我过去常常对数据库中的数据进行处理,这似乎与它应该完全一样。

1 个答案:

答案 0 :(得分:0)

我只是记录了所有数据。事实证明我在之前的日志记录逻辑中有错误,导致我无法发现错误。 然后我在存储过程中发现一个错误,在更新后给出了错误的数据(错误,缺少“,”,两个返回值之间)。

msg += "mynewone";
msg += System.Environment.NewLine;
var columns = row.Table.Columns;
foreach (System.Data.DataColumn col in columns)
    msg += col.ColumnName + "->" + row[col.ColumnName];
msg += System.Environment.NewLine;

msg += "myoriginal";
msg += System.Environment.NewLine;

try {
    foreach (System.Data.DataColumn col in columns)
        msg += col.ColumnName + "->" + row[col.ColumnName, System.Data.DataRowVersion.Original];
}
catch (System.Exception) {
    // possible that original data does not exist - simply skip this then
}
msg += System.Environment.NewLine;