gpt4 book ai didi

c# - 使用 C# 和 Entity Framework 向 SQL Server 插入小浮点值

转载 作者:行者123 更新时间:2023-11-30 23:26:19 24 4
gpt4 key购买 nike

我的代码是这样的。

public class MyDbContext : DbContext
{
public virtual DbSet<CurrentData> CurrentData { get; set; }
}

public class CurrentData
{
public int ID { get; set; }
public DateTime Time { get; set; }
public float Value { get; set; }
}

...

float f = 1.37E-40f;

using (var context = new MyDbContext())
{
var data = new CurrentData() { ID = 100, Time = DateTime.Now, Value = f };
context.CurrentData.Add(data);

var result = context.SaveChanges();
}

由于浮点值较小,它在 SaveChanges() 上引发异常。

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 4 (\"@1\"): The supplied value is not a valid instance of data type real. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.

如果我将 f 更改为 0,它会正常工作。

当我检查 SQL Server 的 REAL 类型范围时,最小正值是 1.18E-38。

https://msdn.microsoft.com/en-us/library/ms173773.aspx

所以如果C#中的float值小于1.18E-38,就会出现异常。

我像这样更改了 f

if (f > 0 && f < 1.18E-38f)
f = 0;
else if (f < 0 && f > -1.18E-38f)
f = 0;

但是我觉得不太好看。

什么是更好的解决方案?

我使用 SqlDataAdapter 而不是 Entity Framework 进行了测试,得到了同样的异常。

我将 EF v6.1.3 和 .NET 4.5.1 与 SQL Server 2012 结合使用。

最佳答案

这里的问题是 C# 在 x86 架构上运行时支持非规范化浮点值,而 SQL Server 则不支持。因此,C# float 比 SQL Server REAL 支持更多的值,即使两者名义上都是单精度浮点类型。 (更令人困惑的是,SQL Server 调用的FLOAT 实际上是 double 类型,C# 调用double,所以float != FLOAT -- 但这不是这里的问题)。

在 C# 中无法禁用非规范化值,也没有非常好的方法来测试它们。 This question不过,在答案中有一些方法。当然,另一种方法是将 SQL Server 端列的精度提高到 FLOAT;这可以处理 C# float 范围内的所有值,甚至是非规范化的。当然,当您从数据库中读取一个不适合 float 的值时,这只会转移问题。当您需要存储 C# double 时,它没有留下任何解决方案,因为在 SQL 端没有相应的更大类型。

出于实际目的,一个简单的范围检查可能就足够了,特别是如果您可以将其与您的应用程序实际使用的范围联系起来。

关于c# - 使用 C# 和 Entity Framework 向 SQL Server 插入小浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36915103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com