一尘不染

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

sql

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语句,因为Entity
Framework不支持开箱即用的存储过程返回标量值。让我知道如何从中发送标量数据Stored Procedure


阅读 135

收藏
2021-03-10

共1个答案

一尘不染

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

  • 像这样更改您的存储过程(不要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对话框中,输入要在模型中引用存储过程的名称,从下拉列表中选择过程,然后将过程的返回值选择为 Scalar

  • 最后,像这样编写代码:

    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的替代品。

2021-03-10