精确丢失而批量使用SqlBulkCopy将记录插入SQL

时间:2013-06-30 14:30:27

标签: .net sql sql-server-2008 bulkinsert sqlbulkcopy

我使用以下代码批量将数据表插入到我的SQL表中:

 // Set up the bulk copy object.  
                using (SqlBulkCopy bulkCopy =
                           new SqlBulkCopy(destinationConnection.Connection))
                {
                    bulkCopy.DestinationTableName =
                        Constants.ReportDataTable;

                    // Write from the source to the destination.
                    DataTable dtBulk = GetDatatableInReportDataFormat(dt, objectName, version);
                    bulkCopy.WriteToServer(dtBulk);//To get the Datatable in the SQL table format

                }

我的SQL表中有一个名为“Value”的列,其类型为十进制(28,5)。我的问题是一些带有十进制数的值正在自动舍入,因此我失去了精度,例如0.72768的值被保存为0.72767

在Datatable中,“Value”列的类型为Double。

任何团体都有想法?感谢

2 个答案:

答案 0 :(得分:8)

DataTable中的列设为decimal而不是double ...我强烈怀疑这会使问题消失。

答案 1 :(得分:3)

double的小数精度不固定,即使它是128位或更高。所以这不是“舍入错误”。简单地说,双倍不能保证代表有限小数点范围内的所有实数。当试图存储非常接近零的更大数字或数字时,这种精度损失会增加得更多。

http://en.wikipedia.org/wiki/Double-precision_floating-point_format

如果您要存储需要保证十进制精度的实数,如货币值,经度/纬度或类似值,则将它们存储为十进制类型。

一个uppdate:实际上没有使用double(或单个/ float)修复精度,如果你存储了很大的数字,那么就会出现你无法表示的整数,因为精度会损失,如果计算得到这样的值那么最接近可表示将计算并存储整数。