我试图通过EF调用存储过程并从存储过程中检索返回值。我用this答案作为指导。这是我的存储过程:
CREATE PROCEDURE [dbo].[usp_test]
(
@result int OUT
)
AS
BEGIN
--DO STUFF
SET @result = 0
END
以下是我如何从EF调用它:
var status = new SqlParameter
{
ParameterName = "result",
DbType = DbType.Int32,
Direction = ParameterDirection.Output
};
var result = context.Database.SqlQuery<int>("EXEC usp_test @result", status);
var wasSuccessful = result.First() == 1;
if (!wasSuccessful)
{
//DO STUFF
}
我收到此错误消息:
数据阅读器有多个字段。多个字段对EDM原语或枚举类型无效
我做错了什么?
答案 0 :(得分:4)
在程序结束前尝试each
。
select @result
希望它有效。
答案 1 :(得分:0)
尝试将.First();
添加到结尾...
var result = context.Database.SqlQuery<int>("EXEC usp_test @result", status).First();
我不这样你需要First()
,因为你要返回一个值,这只能用于IEnumerable - 但要仔细检查。
var wasSuccessful = result == 1;
答案 2 :(得分:0)
我想用存储过程返回插入行的新id。所以我也做了一个OUTPUT参数。在使用EF6的C#中,我得到如下:
using System.Data.Entity.Core.Objects;
...
db = new myEntities1();
ObjectParameter returnId = new ObjectParameter("returnId", DbType.Int64);
db.postLogItem("New item.", returnId);
MessageBox.Show("Logitem added. New returnId: " + (int)returnId.Value);
存储过程中变量的名称需要与调用ObjectParameter构造函数的名称匹配。
CREATE PROCEDURE [dbo].[postLogItem]
@description nvarchar(200),
@returnId bigint OUTPUT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.LogItem
(
time,
description
)
VALUES
(
GETDATE(),
@description
);
SET @returnId = SCOPE_IDENTITY();
END
答案 3 :(得分:0)
将ParameterDirection.Output更改为ParameterDirection.ReturnValue
答案 4 :(得分:-3)
如果没有任何作用,那么您可以尝试这种替代方法:
但是,如果你有一个可并行运行许多这样的EF代码的并发系统,那么你的存储过程需要变得更加复杂以处理并发。
谢谢,希望这可能有所帮助。