繁体   English   中英

C# 中的 SqlBulkCopy class 正在更改数值

[英]SqlBulkCopy class in C# is changing a numeric value

我正在使用SqlBulkCopy.WriteToServer -方法将批量数据插入数据库表。 当我将数据表作为方法WriteToServer的参数传递时,一些数值(numeric(17,6))在插入数据库表时被减去.000001 但并非所有值都在发生变化,它是随机发生的,无法识别模式。 10068.121正在更改为10068.120999

现在,当我将数据读取器作为方法 WriteToServer 的参数传递时,它工作正常,数值保持不变。

知道为什么它发生在数据表而不是数据读取器上吗? 我的应用程序是 C# 控制台应用程序。

这是我的代码……如果我将数据表 (_dt) 传递给 _sqlBulkCopy.WriteToServer 方法,那么我就有问题了。 但是当我将数据表 (_dt) 转换为 DataTableReader (_Reader) 时,它工作正常。

DataTable _dt = new DataTable();
_odbCDA.Fill(_dt);
DataTableReader _Reader = new DataTableReader(_dt);

using (SqlBulkCopy _sqlBulkCopy = new SqlBulkCopy(_sqlConnectionString)) 
{
     _sqlBulkCopy.BulkCopyTimeout = 3600;
     _sqlBulkCopy.DestinationTableName = _tableName;
     _sqlBulkCopy.WriteToServer(_Reader); //This works
     //_sqlBulkCopy.WriteToServer(dt); //This is having the issue
     _sqlBulkCopy.Close();
}

没有示例复制很难确定,但是如果我不得不猜测您何时使用DataReader您正在两个具有相同数字类型定义/精度的表之间复制数据,但是当使用DataTable时,该列不会有匹配的精度。 大概这是因为DataReader没有将事物映射到 .NET 类型,但DataTable是。

认为(但尚未测试).NET 类型 map 大约是这样(至少在 SQL 服务器中):

  • C# float -> SQL real
  • C# double -> SQL float
  • C# decimal -> SQL moneynumeric

SQL 让您以 C# 没有的方式指定精度,因此,如果您使用 C# 内置类型丢失精度,那么您很有可能执行从numeric(17,6)

如果我的猜测是正确的, DataTable中受影响的DataColumn上的DataType将类似于System.DoubleSystem.SingleSystem.Decimal

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM