2010-03-22 8 views
10

Je m'excuse de ne poser qu'une question basique, mais je ne trouve pas la cause de cette erreur. J'utilise Entity Framework pour exécuter une procédure stockée, et je passe quatre paramètres, mais la base de données SQL semble les rejeter. Est-ce que quelqu'un peut-il me montrer la bonne direction?EntityFramework Procédure ou fonction '' attend le paramètre '', qui n'a pas été fourni

Mon code:

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)); 

qui produit l'erreur:

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

Le SQL généré est:

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 

Les procédures stockées est:

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

Merci beaucoup.

+0

Pouvez-vous publier la déclaration de votre procédure stockée SQL? Jusqu'à où les paramètres sont définis? –

+0

PROCÉDURE ALTER [dbo]. [SearchDirectoryEntries] \t @DirectoryId int, \t décimal @Latitude (18, 6), \t décimal @Longitude (18, 6), \t @range int Vive – James

+0

Quels sont les définitions de la «recherche» et «point»? c'est-à-dire 'search.DirectoryId' un' int'? – ChrisF

Répondre

22

Le paramètre commandText de votre requête est incorrect. Il devrait être un appel à une procédure stockée avec des paramètres au lieu du nom de la procédure stockée simplement:

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)); 

Aussi ne pas oublier d'enlever « @ » du constructeur SqlParameter.

+1

Merci! Totalement fixé mon problème après de nombreux faux départs. – strongriley

+1

Nulle part dans la documentation de 'SqlParameter' il ne spécifie de supprimer le' @ 'du nom. D'où vient-il? Vous devrez le supprimer si vous utilisez un 'ObjectParameter' cependant. – test

Questions connexes