2011-02-21 29 views
8

Tengo un procedimiento almacenado que devuelve un valor, no un conjunto de datos, y tengo problemas para hacerlo funcionar con EF4.Llamar al procedimiento almacenado con los parámetros

que he visto esto: http://dotnet.dzone.com/news/how-retrieve-stored-procedure

Esto es lo que hice: He añadido un procedimiento para el modelo, y se importa una función.

El primer problema que tuve fue el hecho de que los parámetros en mi procedimiento se llaman como @_Parameter_in. Eso hizo que EF los traiga como p_Parameter_in porque no funcionaría con un carácter de subrayado como primer carácter. Luego, cuando llamé al procedimiento almacenado, puedo ver en la llamada del Analizador de SQL que busca @p_Parameter_in y, por supuesto, hubo un problema con eso.

Ahora renombré los parámetros y busqué en SQL Trace: todo se ve y funciona muy bien. El problema es que no puedo sacar el valor. Aquí es cómo se ve mi código:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32)); 
newKey.Value = 0; 
context.GetNextSurrogateKey_v2("tTest", newKey); 

Después de llamar newKey.Value, siempre es 0 o cualquier valor que establece que lo haga. No devuelve el valor. Sospecho que mi problema es con la forma en que importo la función. Yo uso Scalars y el tipo de datos Int32. "Crear nuevo tipo complejo" está deshabilitado para mí por algún motivo. ¿Alguien tuvo ese problema?

Respuesta

7

Supongo que estoy aquí porque no puedo ver el procedimiento almacenado al que está llamando. Creo que quiere recuperar un valor escalar que ha sido devuelto por el procedimiento almacenado, en lugar del valor de un parámetro de salida como se define en el procedimiento almacenado.

Creo que desea definir una nueva Función dentro del EDM y señalar esto en el procedimiento almacenado. Una rápida de Google tiene esta solución potencial: http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

+0

Eso es algo que observar, solo puedo modificar el procedimiento para que funcione de esta manera. Actualmente no devuelvo valor escalar. Asigno valor al parámetro OUTPUT en el procedimiento almacenado. – katit

+0

Eso tampoco funciona. Recibo el error "El lector de datos devuelto por el proveedor de datos de la tienda no tiene suficientes columnas para la consulta solicitada" – katit

+0

Ok, lo hice funcionar. Al colocar, seleccione @MyValue al final del proceso almacenado. La pregunta sigue abierta si es posible usar los parámetros OUTPUT con EF ... – katit

2

El problema es que los parámetros de salida del proceso EF después datareader termina la lectura. Eso es generalmente después de llamar a la función DataBind(). Tuve el mismo problema con los procedimientos de procesamiento más largos. Resuelvo esto usando la función .ToList() en ObjectResult.

var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));  
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList(); 
this.ProductsCount = (int?)rowsCount.Value; 

Las filas o los valores simples probablemente puedan resolverse con la función FirstOrDefault().

0

Tuve el mismo problema que describí Jan Remunda. Alguien ha cambiado el tipo de retorno de Integer a Entity.Core.Objects.ObjectResult (¿de Entero?), Lo que ha resultado en que siempre devuelve nada.

Para nosotros, la solución fue forzar a EF a leer el retorno del proceso almacenado al agregar la función .FirstOrDefault() a la devolución.

Cuestiones relacionadas