2010-03-22 15 views
10

Pido disculpas por hacer solo una pregunta básica, pero no puedo encontrar la causa de este error.EntityFramework Procedimiento o función '' espera parámetro '', que no se suministró

Estoy utilizando Entity Framework para ejecutar un procedimiento almacenado, y estoy pasando en cuatro parámetros, sin embargo, la base de datos SQL parece rechazarlos. ¿Alguien puede señalarme en la dirección correcta?

Mi código:

ObjectResult<SearchDirectoryItem> resultList = container.ExecuteStoreQuery<SearchDirectoryItem>("SearchDirectoryEntries", 
      new SqlParameter("@DirectoryId", search.DirectoryId), 
      new SqlParameter("@Latitude", point.Latitude), 
      new SqlParameter("@Longitude", point.Longitude), 
      new SqlParameter("@Range", search.RangeMiles)); 

que produce el error:

Procedure or function 'SearchDirectoryEntries' expects parameter '@DirectoryId', which was not supplied.

genera el SQL es:

exec sp_executesql N'SearchDirectoryEntries',N'@DirectoryId int,@Latitude decimal(7,5),@Longitude decimal(6,5),@Range int',@DirectoryId=3,@Latitude=53.36993,@Longitude=-2.37013,@Range=10 

Los procedimientos almacenados es:

ALTER PROCEDURE [dbo].[SearchDirectoryEntries] 
@DirectoryId int, 
@Latitude decimal(18, 6), 
@Longitude decimal(18, 6), 
@Range int 

Muchas gracias.

+0

¿Puede publicar la declaración de su procedimiento SQL almacenado? Hasta donde se definen los parámetros? –

+0

ALTER PROCEDIMIENTO [dbo]. [SearchDirectoryEntries] int \t @DirectoryId, \t decimal @Latitude (18, 6), \t decimal @Longitude (18, 6), \t @Range int Saludos – James

+0

¿Cuáles son los definiciones de 'búsqueda' y' punto'? es decir, ¿'search.DirectoryId' an' int'? – ChrisF

Respuesta

22

El parámetro de texto de comando en su consulta es incorrecto. Debe ser una llamada a un procedimiento almacenado con parámetros en lugar de nombre de procedimiento almacenado simplemente:

ObjectResult<SearchDirectoryItem> resultList = container.ExecuteStoreQuery<SearchDirectoryItem>(
    "Exec SearchDirectoryEntries @DirectoryId, @Latitude, @Longitude, @Range", 
    new SqlParameter("DirectoryId", search.DirectoryId), 
    new SqlParameter("Latitude", point.Latitude), 
    new SqlParameter("Longitude", point.Longitude), 
    new SqlParameter("Range", search.RangeMiles)); 

Tampoco se olvide de quitar '@' de SqlParameter constructor.

+1

¡Gracias! Totalmente resuelto mi problema después de numerosos comienzos en falso. – strongriley

+1

En ninguna parte de la documentación para 'SqlParameter' especifica que elimine' @ 'del nombre. ¿De dónde viene eso? Sin embargo, tendrá que eliminarlo si está utilizando un 'ObjectParameter'. – test

Cuestiones relacionadas