【问题标题】:Stored Procedure return -1 for all cases in entity framework对于实体框架中的所有情况,存储过程返回 -1
【发布时间】:2015-10-20 22:55:56
【问题描述】:
CREATE PROC spIsValidUser
     @UserName varchar(50),
     @Password varchar(50) 
AS
    IF  Exists(SELECT * FROM Users where UserName=@UserName and Password=@Password)
    BEGIN
        return 0

    END
    ELSE
    BEGIN
        return 1
    END
 GO

我已经创建了这个Stored Procedure 并尝试使用实体框架调用这个Stored Procedure。以下是用 C# 编写的代码。

MyBusEntities db = new MyBusEntities();
int empQuery = db.spIsValidUser("abc", "abc@123");

spIsValidUser Stored Procedure 在所有情况下都返回-1。请让我知道错误。

编辑 - 根据给定的答案,不使用存储过程返回语句,因为实体框架不支持存储过程返回标量值开箱即用..让我知道如何发送标量数据Stored Procedure?

【问题讨论】:

  • 您是否尝试过单步执行您的代码、枚举过程或直接在 SQL Server 上手动执行过程?我怀疑它的存在,但除非我们快速调试,否则无法确定。
  • 是正确定义和实例化的 db。 (当您枚举时)是否列出了 spIsValidUser 过程。当您在 SQL 服务器上手动调用此过程时,它会返回什么。
  • 是的。我在 SQL Server 中使用以下语句手动执行了 spIsValidUser。 EXEC spIsValidUser 'abc' 'abc@123' 它给了我输出 0。我还检查了 Db。它被正确定义和实例化。
  • 为什么要在用户有效时返回 0,而在用户无效时返回 1。这里有点奇怪的身份验证逻辑。您是否考虑过行业标准做法?您可以使用在线提供的标准身份验证代码项目之一,并根据您的需要对其进行自定义。
  • 我们稍后会在这个项目中集成认证逻辑。这个问题在调用任何返回整数的存储过程时都会面临。

标签: c# sql sql-server entity-framework stored-procedures


【解决方案1】:

您的存储过程当前返回一个标量值。使用以下步骤解决此问题:

  • 像这样改变你的存储过程(不要在存储过程中使用关键字return来返回值,实体框架不支持存储过程返回标量值开箱即用。但是有一个解决方法):

    ALTER PROC spIsValidUser
    @UserName varchar(50),
    @Password varchar(50) 
    AS
    SELECT Count(*) FROM Users where UserName= @UserName and Password= @Password
    return
    
  • 您需要将存储过程导入为Function。右键单击实体模型的工作区并选择Add -> Function Import

  • Add Function Import 对话框中,输入您希望在模型中引用您的存储过程的名称,从下拉列表中选择您的过程,然后选择过程的返回值为 标量

  • 最后给你写这样的代码:

    MyBusEntities db = new MyBusEntities();
    System.Nullable<int> empQuery = db.spIsValidUser("abc", "abc@123").SingleOrDefault().Value;
    MessageBox.Show(empQuery.ToString());// show 1 if Exist and 0 if not Exist
    

编辑:我认为对存储过程返回值的支持取决于实体框架的版本。此外,Entity Framework 没有丰富的存储过程支持,因为它是 ORM,而不是 SQL 替代品。

【讨论】:

  • 谢谢,正是 OP 所要求的!很有帮助!
  • 我很好奇。当我们不将 Scalar 设置为复杂类型时,存储过程已经返回一个不起作用的 int。那个 int 到底是什么?
【解决方案2】:

您是否在 EF 模型中正确导入了存储过程?您是否为存储过程设置了正确的返回类型??

您可以为程序设置 4 种可能的返回类型 可能的返回类型是:

  1. 标量
  2. 复杂
  3. 实体

您需要设置标量返回类型。

如果你不知道如何设置返回类型,那么这里是完整教程http://www.binaryintellect.net/articles/30738a7c-5176-4333-aa83-98eab8548da5.aspx

快速示例。

CREATE PROCEDURE CustOrderCount
    @CustomerID nchar(5)
AS
BEGIN
    SELECT COUNT(*) FROM ORDERS 
        WHERE CUSTOMERID=@CustomerID;
END


NorthwindEntities db = new NorthwindEntities();
var count = db.CustOrderCount("ALFKI");
int ordercount = count.SingleOrDefault().Value;

这将返回 int 订单计数。

【讨论】:

  • 我已经尝试过这个东西了。我已经在 EF 模型中导入了存储过程并且还设置了返回类型。让我知道在这种情况下我必须设置哪种返回类型?目前我已经设置了“无”返回类型。我也尝试更改标量类型(Int32),但它给了我运行时异常。
  • 您能否将您的问题作为示例解决方案放在 github 中并为我们提供访问权限。这是我可以告诉你为什么它返回 -1 的唯一方法
【解决方案3】:

你试过了吗:

CREATE PROC spIsValidUser
     @UserName varchar(50),
     @Password varchar(50) 
AS
    IF  Exists(SELECT * FROM Users where UserName=@UserName and Password=@Password)
    BEGIN
        SELECT 0

    END
    ELSE
    BEGIN
        SELECT 1
    END
 GO

【讨论】:

  • 它工作正常。它返回 ObjectResult 并在应用 SingleOrDefault() 函数后给出正确的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多