对于entity framework中的所有情况,存储过程返回-1

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并使用entity framework调用此Stored Procedure 。 下面是用C#编写的代码。

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

spIsValidUser Stored Procedure在所有情况下都返回-1 。 请告诉我错误。

编辑 – 根据给定的答案,存储过程不使用return语句,因为entity framework不能支持存储过程返回开箱即用的标量值。让我知道如何从Stored Procedure发送标量数据?

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

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

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

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

  • 最后写这样的代码:

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

编辑:我认为对存储过程返回值的支持取决于entity framework的版本。 entity framework也没有丰富的存储过程支持,因为它是一个ORM,而不是SQL替代品。

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

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

  1. 没有
  2. 标量
  3. 复杂
  4. 实体

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

如果您不知道如何设置返回类型,那么这里是完整的教程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 order count。

你有没有尝试过:

 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