【发布时间】: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