gpt4 book ai didi

c# - SqlBulkCopy - 数据源中 String 类型的给定值无法转换为指定目标列的 money 类型

转载 作者:IT王子 更新时间:2023-10-29 03:57:55 25 4
gpt4 key购买 nike

我在尝试从 DataTable 执行 SqlBulkCopy 时遇到此异常。

Error Message: The given value of type String from the data source cannot be converted to type money of the specified target column.
Target Site: System.Object ConvertValue(System.Object, System.Data.SqlClient._SqlMetaData, Boolean, Boolean ByRef, Boolean ByRef)

我明白错误在说什么,但我如何才能获得更多信息,例如发生这种情况的行/字段?数据表由第三方填充,最多可包含 200 列和 10k 行。返回的列取决于发送给第 3 方的请求。所有datatable 列都是字符串类型。我的数据库中的列并非都是 varchar,因此,在执行插入之前,我使用以下代码(已删除非重要代码)格式化数据表值:

//--- create lists to hold the special data type columns
List<DataColumn> IntColumns = new List<DataColumn>();
List<DataColumn> DecimalColumns = new List<DataColumn>();
List<DataColumn> BoolColumns = new List<DataColumn>();
List<DataColumn> DateColumns = new List<DataColumn>();

foreach (DataColumn Column in dtData.Columns)
{
//--- find the field map that tells the system where to put this piece of data from the 3rd party
FieldMap ColumnMap = AllFieldMaps.Find(a => a.SourceFieldID.ToLower() == Column.ColumnName.ToLower());

//--- get the datatype for this field in our system
Type FieldDataType = Nullable.GetUnderlyingType(DestinationType.Property(ColumnMap.DestinationFieldName).PropertyType);

//--- find the field data type and add to respective list
switch (Type.GetTypeCode(FieldDataType))
{
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64: { IntColumns.Add(Column); break; }
case TypeCode.Boolean: { BoolColumns.Add(Column); break; }
case TypeCode.Double:
case TypeCode.Decimal: { DecimalColumns.Add(Column); break; }
case TypeCode.DateTime: { DateColumns.Add(Column); break; }
}

//--- add the mapping for the column on the BulkCopy object
BulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(Column.ColumnName, ColumnMap.DestinationFieldName));
}

//--- loop through all rows and convert the values to data types that match our database's data type for that field
foreach (DataRow dr in dtData.Rows)
{
//--- convert int values
foreach (DataColumn IntCol in IntColumns)
dr[IntCol] = Helpers.CleanNum(dr[IntCol].ToString());

//--- convert decimal values
foreach (DataColumn DecCol in DecimalColumns)
dr[DecCol] = Helpers.CleanDecimal(dr[DecCol].ToString());

//--- convert bool values
foreach (DataColumn BoolCol in BoolColumns)
dr[BoolCol] = Helpers.ConvertStringToBool(dr[BoolCol].ToString());

//--- convert date values
foreach (DataColumn DateCol in DateColumns)
dr[DateCol] = dr[DateCol].ToString().Replace("T", " ");
}

try
{
//--- do bulk insert
BulkCopy.WriteToServer(dtData);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();

//--- handles error
//--- this is where I need to find the row & column having an issue
}

此代码应为其目标字段设置所有值的格式。在这个错误的情况下,小数点,清除它的函数将删除任何不是 0-9 或 . (小数点)。引发错误的该字段在数据库中可以为空。

2级异常有这个错误:

Error Message: Failed to convert parameter value from a String to a Decimal.
Target Site: System.Object CoerceValue(System.Object, System.Data.SqlClient.MetaType, Boolean ByRef, Boolean ByRef, Boolean)

并且3级异常有这个错误:

Error Message: Input string was not in a correct format
Target Site: Void StringToNumber(System.String, System.Globalization.NumberStyles, NumberBuffer ByRef, System.Globalization.NumberFormatInfo, Boolean)

有没有人有任何想法可以解决?或任何获取更多信息的想法?

最佳答案

对于偶然发现这个问题并收到关于 nvarchar 而不是金钱的类似错误消息的人:

The given value of type String from the data source cannot be converted to type nvarchar of the specified target column.

这可能是列太短造成的。

例如,如果您的列定义为 nvarchar(20) 并且您有一个 40 个字符的字符串,您可能会遇到此错误。

Source

关于c# - SqlBulkCopy - 数据源中 String 类型的给定值无法转换为指定目标列的 money 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18140012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com