我正在使用Entity Framework 4.1并且有时需要调用存储过程。其中一些返回int作为返回值。例如
CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT @@Identity
(更新:删除了返回值,不相关。我们将返回身份)
我的资源库类中有以下代码:
var orderNo = context.Database.SqlQuery<int>("EXEC myProc").Single();
此操作失败,并显示错误消息The specified cast from a materialized 'System.Decimal' type to the 'System.Int32' type is not valid.
如果我将上面的代码更改为
var orderNo = context.Database.SqlQuery<decimal>("EXEC myProc").Single();
一切正常。
现在,我认为我应该能够返回一个int。这样做的正确方法是什么?
答案 0 :(得分:10)
我认为,根据您的问题的编辑 - 我在您发布后不久点击它,然后稍后刷新 - 这只是您返回身份时的问题?
如果是,则为小数,因为@@ IDENTITY(和SCOPE_IDENTITY)返回数字(38,0)。请参阅此问题的答案:Why does select SCOPE_IDENTITY() return a decimal instead of an integer? 如上所述,强制转换为int应该允许EF正确检测类型。
答案 1 :(得分:7)
不要返回@@Identity
,否则可能会遇到意外行为,因为无论会话如何,@@Identity
都会返回最后一个ID。请改用SCOPE_IDENTITY()
我会想象返回SELECT cast(SCOPE_IDENTITY() as int)
C#方面会为你做什么
答案 2 :(得分:4)
@@ IDENTITY返回一个精度为38且标度为0的数字类型,因此.NET正确地将您的SP识别为返回小数。您可以通过在SP中添加强制转换来解决此问题:
CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT CAST(@@Identity as int)