【问题标题】:Get the line number on which the request to database ended with an error获取对数据库的请求以错误结束的行号
【发布时间】:2018-05-24 17:23:36
【问题描述】:

我使用此代码发送 SQL 请求:

 SqlBulkCopy bulkCopy = new SqlBulkCopy(Connection);

 foreach (DataColumn column in dt.Columns)
 {
     bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
 }

 bulkCopy.DestinationTableName = "nsi." + classifierData.Info.TableName;
 bulkCopy.WriteToServer(dt);

并得到这个异常:

从 bcp 客户端收到无效的 colid 列长度

有什么方法可以确定是哪一行导致了错误?

我尝试过使用它,但它不起作用(值始终相同):

 FieldInfo currentRow = typeof(SqlBulkCopy).GetField("_currentRowLength", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowNumber = currentRow.GetValue(bulkCopy);

 FieldInfo _rowsCopiedField = typeof(SqlBulkCopy).GetField("_rowsCopied", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowN = _rowsCopiedField.GetValue(bulkCopy);

请帮帮我...

【问题讨论】:

标签: c# sql-server reflection sqlbulkcopy


【解决方案1】:

我相信从纯粹的 SqlBulkCopy 中识别错误行的唯一方法是使用 NotifyAfter 属性 + SqlRowsCopied 事件 + BatchSize = 1。

通过这些,您现在可以轻松地拥有一个 Index 属性,为每个成功复制的行递增,您将能够找到错误的索引。

例如,抛出一个错误,你用NotifyAfter = 1重试

bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 1;
bulkCopy.BatchSize = 1;

显然,这不是最佳性能明智的解决方案,但您会找到您的信息。

编辑:回复评论

对不起,我可以得到一个有错误的行列的值吗?

我不这么认为。我们不确切知道哪个列的错误消息有问题。

【讨论】:

  • 感谢您的回答。但它总是为任何请求设置一个值。
  • 我不明白你上一条评论的意思。
  • 对不起,我忘记了你还需要将批量大小设置为 1。如上所述,这不会像正常情况那么快,但至少你会发现错误的行。
  • 对不起,我可以得到一个有错误的行列的值吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2019-03-10
  • 2014-03-02
相关资源
最近更新 更多