对于实体框架中的所有情况,存储过程返回-1

时间:2015-07-29 19:18:53

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

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。请告诉我错误。

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

3 个答案:

答案 0 :(得分:9)

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

  • 像这样更改存储过程(不要在存储过程中使用关键字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。右键单击实体模型的工作区区域,然后选择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
    

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

答案 1 :(得分:5)

您是否正确地在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。

答案 2 :(得分:5)

你试过了吗?

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