簡體   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