with stored mvc framework executesqlcommand ejecutar c# sql sql-server entity-framework stored-procedures

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:

  1. ninguna
  2. Escalares
  3. Complejo
  4. 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 elija Add -> 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.