2014-04-01 4 views
7

Dies ist ein Problem, das mir gegenübersteht, was Genauigkeitsverlust beim Speichern in SQL Server-Datenbank von C# Entity Framework verursacht.Verlust der Präzision von C# zu SQL Server

  1. SQL Server-Datentyp ist decimal(20, 15)
  2. In C# Property als public decimal AssignedGrossBudget { get; set; } definiert ist
  3. in C# Wert in Variable (AssignedGrossBudget) ist 34,09090909090909
  4. Aber in SQL Server-Tabelle ist es 34,090000000000000

Was könnte falsch sein? (Ich verwende Entity Framework db.SaveChanges(); und SQLBulkCopy zum Speichern von Daten von C# zu SQL Server)

Ich möchte 34.09090909090909 statt 34.090000000000000 speichern.

Ich überprüft, indem Sie direkt in die Tabelle einfügen und es funktioniert.

+0

können Sie den Code der Massenkopie bereitstellen? – Fredou

+0

Pls verwenden den Profiler, um exakte, von EF generierte Anweisungen zu erfassen und Textdaten zu posten. – dean

+5

Wahrscheinlich müssen Sie die Genauigkeit für EF konfigurieren: http://StackOverflow.com/questions/3504660/decimal-precision-and-scale-in-ef-code-first – Uriil

Antwort

1

Ein einfaches Beispiel zeigt, dass eine solche Genauigkeitsverlust mit korrekt geschriebenen Code auftritt:

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); 
      } 
     } 
    } 

Deshalb muß ich schließen, das Problem mit Ihrem Code ist, die nicht gebucht wird.

+2

Sie haben keine Idee über Entity Framework, oder? – Toolkit

2

Danke Urril und Remus.

ich Änderungen in Entity Framework wie folgt:

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

     } 

Und für SQL BulkCopy Ich habe Datentyp wie pro Remus Vorschlag.

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

Es funktioniert jetzt und es gibt keinen Verlust (oder vernachlässigbar).

Prost