从C#到SQL Server的精度损失
这是我遇到的问题,当从C#Entity Framework存储在SQL Server数据库中时,会导致精度损失。
decimal(20, 15)
public decimal AssignedGrossBudget { get; set; }
public decimal AssignedGrossBudget { get; set; }
什么可能是错的? (我正在使用实体框架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