Сохраненная процедура возвращает -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