我最近有理由除了我的存储过程返回的表格数据之外还带回一个值。由于EF不支持具有多个结果集的存储过程,我想我可以通过输出参数来完成此操作。但是,使用这种方法我遇到了一个问题,即在某些数值字段中我只返回舍入值。
我的存储过程的参数声明为:
@MyValue numeric(19,6) output
调用映射函数时,我有:
var myValue = new ObjectParameter("MyValue", typeof(decimal));
List<MyResultItem> results = this.ObjectContext.CallMyStoredProc(someId, myValue).ToList();
这总是返回舍入为整数的值(即,刻度为零)。
我首先能够通过手动编辑基础XML到.edmx来手动添加Precision和Scale属性来解决这个问题:
<Parameter Name="MyValue" Type="numeric" Mode="InOut" Precision="19" Scale="6" />
下次我执行“从数据库更新模型”时,这并不奇怪,完全放弃了。
我似乎通过更新ObjectParameter
的声明来更可靠地修复它:
var myValue = new ObjectParameter("MyValue", 999999999.999999M);
然而,这似乎非常像一个黑客,我担心未来的问题(即使只是维护这个神奇的数字)。是否有更好,更可靠的方法在实体框架中使用输出参数?
答案 0 :(得分:0)
我现在在更多的地方需要这个,所以我为它创建了一个帮助方法:
Microsoft.CSharp
MySql.Data
PresentationFramework
System
System.Configuration
System.Configuration.Install
System.Core
System.Data
System.Data.DataSetExtensions
System.Drawing
System.Management
System.Windows.Forms
System.Xml
System.Xml.Linq
这并不能免除代码中魔术数字的使用,但至少它确实有助于在代码中看到的内容与您在数据库中看到的内容完全匹配。 (即,对于/// <summary>
/// Get the maximum allowed value for a SQL numeric of the specified scale and precision.
/// </summary>
/// <param name="scale">The scale.</param>
/// <param name="precision">The precision.</param>
/// <returns>Decimal representing the maximum value for the specified numeric.</returns>
public static decimal SqlNumericMax(int scale, int precision)
{
return (decimal)Math.Pow(10, (scale - precision)) - (decimal)Math.Pow(10, (-1 * precision));
}
存储的proc参数,您将调用numeric(19,6)
,因此关系更加明显。)
看起来在存储的proc调用之前为参数提供最大值仍然是调用正确填充结果的最佳和最可靠的方法。