C# SQL Server到.Net小数,EF6 dDatabase第一个问题
我当前正在从SQL Server存储过程中读取数据,数据返回为C# SQL Server到.Net小数,EF6 dDatabase第一个问题,c#,sql-server,entity-framework,entity-framework-6,C#,Sql Server,Entity Framework,Entity Framework 6,我当前正在从SQL Server存储过程中读取数据,数据返回为Decimal(38,20) 我知道.Net十进制数是(28,10),但EF为此生成的模型类显示的是十进制数?。当我查询表时,代码抛出一个转换溢出错误,因为它试图将SQL Server十进制数放在.Net decimal字段中 有没有一种简单的方法可以通过数据上下文将其转换为.Net decimal?基本上,我没有修改SQL Server数据类型的权限 SQL Server数据类型: Amount Decimal(38, 20)
Decimal(38,20)
我知道.Net十进制数是(28,10)
,但EF为此生成的模型类显示的是十进制数?
。当我查询表时,代码抛出一个转换溢出错误,因为它试图将SQL Server十进制数放在.Net decimal字段中
有没有一种简单的方法可以通过数据上下文将其转换为.Net decimal?基本上,我没有修改SQL Server数据类型的权限
SQL Server数据类型:
Amount Decimal(38, 20)
实体
public class EntityClass
{
public decimal? Amount { get; set; }
}
当我打电话的时候
var eee = _context.EntityClass
.Select(x => x.Amount)
.FirstOrDefaultAsync();
我明白了
转换溢出错误
在ApplicationDbContext中,您应该添加
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<EntityClass>()
.Property(p => p.Amount )
.HasColumnType("decimal(28,20)");
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity()
.财产(p=>p.金额)
.HasColumnType(“十进制(28,20)”);
这是.NET的SqlClient的一个错误或限制。下面是一个复制:
using (var con = new SqlConnection("server=.;database=tempdb;Integrated Security=true"))
{
con.Open();
var cmd = new SqlCommand("select cast(4210862852.86 as decimal(38,20)) val", con);
using (SqlDataReader rdr = cmd.ExecuteReader())
{
rdr.Read();
var val = rdr.GetDecimal(0);
Console.WriteLine(val);
}
}
问题是这个数字
select cast(cast(4210862852.86 as decimal(38,20)) as varbinary(20))
存储,并通过导线作为
0x261400010000D877FB4DEE8B51699A5005000000
SqlClient将拒绝转换最后4个字节中任何非零的十进制:
internal decimal Decimal
{
get
{
ThrowIfNull();
if (StorageType.Decimal == _type)
{
if (_value._numericInfo.data4 != 0 || _value._numericInfo.scale > 28)
{
throw new OverflowException(SQLResource.ConversionOverflowMessage);
}
return new decimal(_value._numericInfo.data1, _value._numericInfo.data2, _value._numericInfo.data3, !_value._numericInfo.positive, _value._numericInfo.scale);
}
if (StorageType.Money == _type)
{
long l = _value._int64;
bool isNegative = false;
if (l < 0)
{
isNegative = true;
l = -l;
}
return new decimal((int)(l & 0xffffffff), (int)(l >> 32), 0, isNegative, 4);
}
return (decimal)this.Value; // anything else we haven't thought of goes through boxing.
}
}
内部十进制
{
得到
{
ThrowIfNull();
if(StorageType.Decimal==\u类型)
{
如果(_value._numericInfo.data4!=0 | | | u value._numericInfo.scale>28)
{
抛出新的OverflowException(SQLResource.ConversionOverflowMessage);
}
返回新的小数(_值._numericInfo.data1,_值._numericInfo.data2,_值._numericInfo.data3,!_值._numericInfo.positive,_值._numericInfo.scale);
}
if(StorageType.Money==\u类型)
{
长l=_值。_int64;
bool为阴性=假;
if(l<0)
{
isNegative=true;
l=-l;
}
返回新的小数((int)(l&0xffffffff),(int)(l>>32),0,为负,4);
}
return(decimal)this.Value;//我们没有想到的任何东西都会经过装箱。
}
}
我在这里打开了一个针对.NET Core的问题:什么版本的EF?您需要保留多少有效数字?数据库中的什么值导致了溢出?这肯定是一个问题(-4210862852.86000000000000000000)。是的。我可以重新设置。什么版本的EF?为什么不在类中使用double?公共double?金额{get;set;}@YairI double不仅仅是
而已,它会让事情变得更糟。它的范围比Decimal小,并且保证会导致舍入错误。它也不会影响此错误-字段的范围太长“我没有权限修改SQL Server数据类型”OP的问题是数据库字段的精度为38。Decimal
最多可以处理28。HasColumnType(“Decimal(28,20)”)
也不会更改现有字段的精度,因此它不会影响存储在其中的值。