获取对数据库的请求以错误结束的行号

Get the line number on which the request to database ended with an error

我使用此代码发送 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);

并得到这个异常:

Received an invalid column length from the bcp client for 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);

求求大家帮帮我...

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

从这些,你现在可以很容易地得到一个 Index 属性,你为每个成功复制的行递增,你将能够找到错误的索引。

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

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

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

编辑:回复评论

Sorry, but can I get a value of row-column with error?

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