从C#到SQL Server的精度损失

这是我遇到的问题,当从C#Entity Framework存储在SQL Server数据库中时,会导致精度损失。

  • SQL Server数据类型是decimal(20, 15)
  • 在C#中,Property被定义为public decimal AssignedGrossBudget { get; set; } public decimal AssignedGrossBudget { get; set; }
  • 在变量(AssignedGrossBudget)中的C#值是34.09090909090909
  • 但在SQL Server表中它是34.090000000000000
  • 什么可能是错的? (我正在使用实体框架db.SaveChanges();和SQLBulkCopy将数据从C#存储到SQL Server)

    我想存储34.09090909090909而不是34.090000000000000。

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


    一个简单的例子表明,正确书写的代码不会出现这种精度损失:

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

    因此,我必须得出结论,问题在于您的代码未发布。


    感谢Urril和Remus。

    我在实体框架中进行如下更改:

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

    对于SQL BulkCopy,我按照Remus的建议添加了数据类型。

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

    它正在工作,没有损失(或可忽略不计)。

    干杯

    链接地址: http://www.djcxy.com/p/19663.html

    上一篇: Loss of Precision from C# to SQL Server

    下一篇: How can I use grep to find a word inside a folder?