c# - mvc - executesqlcommand entity framework stored procedure
Procedimiento almacenado devuelve-1 para todos los casos en el marco de la entidad (3)
¿Ha importado correctamente sus procedimientos almacenados en el modelo EF? ¿Está configurando el tipo de retorno correcto a los procedimientos almacenados?
Hay 4 tipos de devolución posibles que puede configurar según sus procedimientos. Los tipos de devolución posibles son:
- ninguna
- Escalares
- Complejo
- Entidades
Es necesario establecer el tipo de retorno escalar.
Si no sabe cómo configurar el tipo de retorno, aquí está el tutorial completo http://www.binaryintellect.net/articles/30738a7c-5176-4333-aa83-98eab8548da5.aspx
Ejemplo rápido.
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;
esto devolverá el recuento de pedidos int.
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
He creado este Stored Procedure
y tring para llamar a este Stored Procedure
utilizando el marco de entidad. A continuación se muestra el código escrito en C #.
MyBusEntities db = new MyBusEntities();
int empQuery = db.spIsValidUser("abc", "abc@123");
Stored Procedure
spIsValidUser
devuelve -1
en todos los casos. Por favor, hágamelo saber error.
EDITAR : de acuerdo con la respuesta dada, el procedimiento de almacenamiento no se usa en la declaración de retorno porque Entity Framework no puede admitir los valores escalares de retorno de procedimientos almacenados. Déjeme saber cómo puedo enviar datos escalares desde el Stored Procedure
.
Has probado:
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
Su procedimiento almacenado actualmente devuelve un valor escalar . Utilice los siguientes pasos para resolver este problema:
Cambie su procedimiento almacenado de esta manera (No use la palabra clave
return
en el procedimiento almacenado para devolver el valor, Entity Framework no puede admitir valores escalares de procedimientos almacenados fuera de la caja. PERO hay una solución):ALTER PROC spIsValidUser @UserName varchar(50), @Password varchar(50) AS SELECT Count(*) FROM Users where UserName= @UserName and Password= @Password return
Necesita importar el procedimiento almacenado como una
Function
. Haga clic con el botón derecho en el área del área de trabajo de su modelo de Entidad y elijaAdd -> Function Import
.En el cuadro de diálogo
Add Function Import
, ingrese el nombre al que desea que se refiera su procedimiento almacenado en su modelo, elija su procedimiento en la lista desplegable y elija el valor de retorno del procedimiento como escalar .Finalmente escribe tu código como este:
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
Edición: creo que la compatibilidad con los valores de retorno de los procedimientos almacenados depende de la versión de Entity framework. Además, Entity Framework no tiene soporte de procedimientos almacenados enriquecidos porque es un ORM, no un reemplazo de SQL.