【问题标题】:tracing fault with SqlBulkCopy in .Net在 .Net 中使用 SqlBulkCopy 跟踪故障
【发布时间】:2020-06-12 14:15:40
【问题描述】:

我在使用 SqlBulkCopy 方法将 DataTable 写入数据库表时遇到异常。有没有办法获得更具体的信息,例如错误的列/值有错误,因为如下所示的错误并没有告诉我太多?

Input string was not in a correct format.
Failed to convert parameter value from a String to a Int32.
The given value of type String from the data source cannot be converted to type int of the specified target column.

我已经检查并再次检查,我的数据表中的每个数据类型都与我的数据库表相同,并且尝试测试样本一切都很好。就在我大规模运行它时,它会出错。但是,当我查看 DataTable 时,所有条目都填充了有效数据。

我的代码很简单:

Dim trans As SqlTransaction = conn.BeginTransaction()
Try
     Dim c As SqlBulkCopy = New SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans) SqlBulkCopyOptions.TableLock, trans)
     c.DestinationTableName = $"CableLink"
     c.WriteToServer(t)
     trans.Commit()
Catch ex As Exception
     trans.Rollback()
     MsgBox(ex.Message)
End Try

我的数据表“t”是使用反射从特定类的列表创建的,这是我检查每个列类型与我的类匹配的地方。唯一真正的区别是某些表列是 Integer 映射到 smallint 和 Single 映射到 float,但这些不是字符串,并且数字适合范围。

完整的堆栈跟踪如下

at System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean& coercedToDataFeed)
   at System.Data.SqlClient.SqlBulkCopy.ReadWriteColumnValueAsync(Int32 col)
   at System.Data.SqlClient.SqlBulkCopy.CopyColumnsAsync(Int32 col, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyRowsAsync(Int32 rowsSoFar, Int32 totalRows, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table)
   at PrepareCuReFiles.CableLinkList.SaveDataToSQLServer(String server, String db, String schema) in D:\DATA\Projects\CableLinkInfo.vb:line 519

【问题讨论】:

  • 您能否发布或粘贴一些重现此内容的数据?

标签: .net sql-server vb.net


【解决方案1】:

请检查数据库中列的顺序,并且数据表应该匹配,因为 WriteToServer 方法不映射列名。

【讨论】:

  • 是的,因为正如我在原始消息中所提到的,它适用于较小的样本。但无论如何我已经检查过了,它匹配得很好。
  • 如果是这种情况,问题可能与数据本身有关。而不是使用 WriteToServer 迭代、记录和插入所有记录,这对您来说可能很耗时,但您可能能够找出导致问题的记录。抱歉回复晚了。
【解决方案2】:

我遵循了这个解决方案,但是虽然它没有解决我的解决方案(sql没有引发错误)

SqlBulkCopy with ObjectReader - Failed to convert parameter value from a String to a Int32

它将一行的内容转储到调试日志中,所以我将该数据输入到一个测试对象中,它显示我的类中的错误是一个单一属性,但该列是一个 int。

所以我猜,它在某处将 Single 转换为 String,然后尝试从 String 转换为 Int。也许这就是尝试将 Single 转换为 Int32 时类型转换的工作原理?

【讨论】:

  • 它是如何显示的?因此,您可以使用这一行调试数据和可能的 10 行 vb 代码进行完整的最小复制?将其添加到您的问题中...
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多