2012-04-26 43 views
10

Estoy tratando de obtener el valor de retorno de un procedimiento almacenado. Aquí hay un ejemplo de dicho procedimiento almacenado:Entity Framework - valor de retorno de procedimiento almacenado

select 
    Name, 
    IsEnabled 
from 
    dbo.something 
where 
    ID = @ID 

if @@rowcount = 0 
    return 1  

return 

Esta es una selección simple. Si se encuentran 0 filas, mi conjunto de resultados será nulo, pero aún tendré un valor de retorno.

Esto es un mal ejemplo, ya que este es un seleccionar, así que estoy seguro de que podría encontrar si se devolvieron 0 filas. Sin embargo, en una inserción, eliminación u otras llamadas, necesitamos este valor de retorno para saber si hubo un problema. No he podido encontrar la manera de obtener este valor de retorno. Puedo obtener valores de salida, puedo obtener conjuntos de resultados, pero ningún valor de retorno.

Puedo obtener el valor de retorno si llamo a SQL manualmente, o incluso si ejecuto un SqlCommand usando Entity Framework, pero esto no es lo que quiero hacer.

¿Alguna vez alguien ha podido obtener el valor de retorno de un procedimiento almacenado utilizando Entity Framework?

¡Gracias por la ayuda!

+3

Entity Framework es un ORM y no pretende sustituir por completo todas las llamadas a la base de datos a partir de su aplicación. – cadrell0

+3

_I puede obtener el valor de retorno si llamo SQL manualmente, o incluso si me quedo un SQLCommand utilizando el framework_ entidad - que es su respuesta – jrummell

+0

@Lamak - ¡Vaya mi error, lo vi debajo del 50% y supone el peor –

Respuesta

2

No. Entity Framework no tiene un soporte rico de procedimientos almacenados porque es un ORM, no un reemplazo de SQL.

Como ya ha descubierto, si necesita utilizar características menos comunes (¿más avanzadas?) De los procedimientos almacenados, tendrá que utilizar ADO.NET, que es muy antiguo.

+2

para añadir a esto:.. @@ recuento de filas devolverá una valor escalar, o para el caso, cualquier select @value devolverá un valor escalar. Si ya tiene un conjunto de resultados, agregará un nuevo conjunto de resultados. Actualmente, 4.0 no admite múltiples conjuntos de resultados, pero el Framework 4.5 con EF admite conjuntos de resultados múltiples. – bugnuker

-1

Con el fin de obtener el resultado interesado en EF, que debe devolver una misma estructura (no 1 y Nombre, IsEnabled) En esta consulta debe devolver '', 0, por ejemplo, en lugar de 1 en la condición if:

 
select 
    Name, 
    IsEnabled 
from 
    dbo.something 
where 
    ID = @ID 

if @@rowcount = 0 
    return '',0 
+1

¿Tiene esto algo que ver con la pregunta? – SQLMason

3

He podido obtener el valor de retorno (y también los parámetros de salida y entrada) con Entity Framework 5 (pero creo que funciona desde la versión 4.x) usando el primer acercamiento de código. De su publicación, no veo qué versión de EF está usando y cómo está haciendo su mapeo; si se tiene en cuenta al utilizar el enfoque de código primero aquí se puede encontrar mi post con la solución:

Get return value from stored procedure

4

supongo apoyo de los valores de retorno de procedimiento almacenado depende de la versión de Entity Framework. Aunque el valor de devolución directa no me funcionaba, logré obtener valor usando el parámetro de procedimiento almacenado OUTPUT. Ejemplo:

USE [YOUR_DB_NAME] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[TestReturnValue] 
    @InputValue int = 0, 
    @Result int OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT @Result = @InputValue 
    RETURN(@InputValue); 
END 

Este es el código de prueba:

void TestReturnValue() 
{ 
    using (var db = new YourDBContext()) 
    { 
     var result = new System.Data.Objects.ObjectParameter("Result", 0); 
     Console.WriteLine("SP returned {0}", db.TestReturnValue(123, result)); 
     Console.WriteLine("Output param {0}", result.Value); 
    } 
} 

Y esta es la salida:

SP returned -1 
Output param 123 

Como se puede ver directamente volverá salida del valor de algunos parámetros de basura, pero la producción funciona!

This article provides general info on two ways of returning values from SP

Esperanza esto ayuda

0

debe utilizar el "Context.Database.SQLQuery", y especificar el tipo de salida del procedimiento almacenado

 var spReturnVaue = Context.Database.SqlQuery<Type>("[schema].YourSp").FirstOrDefault(); 

     int firstId = Context.Database.SqlQuery<int>("[dbo].GetFirstId").FirstOrDefault(); 
Cuestiones relacionadas