2014-04-01 48 views
7

這是我正面臨的一個問題,它導致從C#實體框架存儲到SQL Server數據庫時導致精度損失。從C#到SQL Server的精度損失

  1. SQL Server數據類型是decimal(20, 15)
  2. 在C#屬性是在變量(AssignedGrossBudget)定義爲public decimal AssignedGrossBudget { get; set; }
  3. 在C#值爲34.09090909090909
  4. 但在SQL Server表是34.090000000000000

什麼可能是錯誤的? (我正在使用實體框架db.SaveChanges();和SQLBulkCopy將數據從C#存儲到SQL Server)

我想存儲34.09090909090909而不是34.090000000000000。

我通過直接插入表中檢查,它的工作原理。

+0

您能否提供批量複製的代碼? – Fredou

+0

請使用Profiler捕捉EF生成的精確語句,併發布textdata。 – dean

+5

可能您需要爲EF配置精度:http://stackoverflow.com/questions/3504660/decimal-precision-and-scale-in-ef-code-first – Uriil

回答

1

一個簡單的例子表明,精度沒有這樣的損失與正確編寫的代碼出現:

static void Main(string[] args) 
    { 
     decimal d = 34.09090909090909M; 
     Console.WriteLine(d); 

     SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(); 
     scsb.IntegratedSecurity = true; 
     scsb.DataSource = @".\sql2012"; 

     using (SqlConnection conn = new SqlConnection(scsb.ConnectionString)) { 
      conn.Open(); 

      using (SqlCommand cmd = new SqlCommand(
       "select cast(@d as DECIMAL(20,15))", conn)) 
      { 
       cmd.Parameters.AddWithValue("@d", d); 
       decimal rd = (decimal) cmd.ExecuteScalar(); 
       Console.WriteLine(rd); 
      } 
     } 
    } 

所以我必須結束,問題是你的代碼,這是不貼。

+2

你不知道實體框架嗎? – Toolkit

2

感謝Urril和Remus。

我做實體框架中的變化如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<StationMapping>().Property(x => x.AssignedGrossBudget).HasPrecision(35, 15); 

     } 

和SQL BulkCopy我添加的數據類型爲每萊姆斯建議。

SpotLookupTable.Columns.Add(new DataColumn("GrossBudget",typeof(decimal))); 

它正在工作,沒有損失(或可忽略不計)。

乾杯