Сохраненная процедура возвращает -1 для всех случаев в структуре сущностей

CREATE PROC spIsValidUser
     @UserName varchar(50),
     @Password varchar(50) 
AS
    IF  Exists(SELECT * FROM Users where [email protected] and [email protected])
    BEGIN
        return 0

    END
    ELSE
    BEGIN
        return 1
    END
 GO

Я создал этот Stored Procedure и tring для вызова этого Stored Procedure с использованием структуры сущности. Ниже приведен код на С#.

MyBusEntities db = new MyBusEntities();
int empQuery = db.spIsValidUser("abc", "[email protected]");

spIsValidUser Stored Procedure return -1 во всех случаях. Сообщите мне об ошибке.

РЕДАКТИРОВАТЬ. В соответствии с данным ответом процедура Store не используется в качестве возвращаемого оператора, потому что Entity Framework не может поддерживать сохраненную процедуру. Возвращайте значения скалярных значений из коробки. Позвольте мне знать, как я могу отправить скалярные данные из Stored Procedure?

Ответы

Ответ 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. Щелкните правой кнопкой мыши область рабочей области вашей модели Entity и выберите Add -> Function Import.

  • В диалоговом окне Add Function Import введите имя, на которое ваша хранимая процедура будет указана в вашей модели, выберите вашу процедуру из выпадающего списка и выберите возвращаемое значение процедуры Скалярное.

  • Наконец напишите код следующим образом:

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

Изменить: Я думаю, что поддержка возвращаемых значений хранимой процедуры зависит от версии инфраструктуры Entity. Также Entity Framework не имеет богатой поддержки хранимых процедур, поскольку ее ORM, а не замена SQL.

Ответ 2

Правильно ли вы импортировали свои хранимые процедуры в EF-модель? и устанавливаете ли вы правильный тип возврата для хранимых процедур?

Существует 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 [email protected];
END


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

это вернет счетчик целых чисел.

Ответ 3

Вы пробовали:

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

    END
    ELSE
    BEGIN
        SELECT 1
    END
 GO