Le paramètre envoyé à la procédure stockée SQL Server n'est pas reconnu

Je suis dans Visual Studio 2010 en utilisant C # et la connection à une database SQL Server 2008. J'appelle une procédure stockée et lui passe un paramètre. Je reçois le message d'erreur ci-dessous.

J'ai vérifié le paramètre étant passé et le nom et la valeur sont corrects et la connection est ouverte, le nom de la procédure stockée est également correct. Si je définis une valeur par défaut pour le paramètre, les lignes correspondantes sont renvoyées. Ci-dessous le message d'erreur que j'ai mis le code en cours d'exécution. Les valeurs transmises à Parameters.AddWithValue sont ParmName = @DetailCategoryID , ParmValue = 2 . Lorsque j'exécute exactement le même code en utilisant Visual Web Developer 2008 Express Edition, cela fonctionne parfaitement.

System.Data.Odbc.OdbcException (0x80131937): ERREUR [42000] [Microsoft] [Pilote ODBC SQL Server] [SQL Server] La procédure ou la fonction 'spGET_Detail' attend le paramètre '@DetailCategoryID', qui n'a pas été fourni. \ R \ n à System.Data.Odbc.OdbcConnection.HandleError (OdbcHandle hrHandle, retCode retcode) \ SystemUnited.Odbc.OdbcCommand.ExecuteReaderObject (comportement CommandBehavior, méthode Ssortingng, Boolean needReader, Object [] methodArguments, SQL_API odbcApiMethod) \ r \ n à System.Data.Odbc.OdbcCommand.ExecuteReaderObject (comportement CommandBehavior, méthode Ssortingng, Boolean needReader) \ r \ n à System.Data.Odbc.OdbcCommand.ExecuteReader (Comportement CommandBehavior) \ r \ n à System.Data. Odbc.OdbcCommand.ExecuteReader () \ r \ n
à DataAccess.OpenReader () dans C: \ Development \ DetailResortingeval \ DetailResortingeval \ Classes \ DataAccess.cs: ligne 1252

Le code

 this.DB_Comm.Parameters.AddWithValue(ParmName, ParmValue); 

Procédure stockée:

 ALTER PROCEDURE spGET_Detail @DetailCategoryID smallint AS BEGIN SET NOCOUNT ON; SELECT F.* FROM dbo.tbDetail_MSTR AS F WHERE (F.DetailCategoryID = @DetailCategoryID) ORDER BY [F].[Description] END GO 

J'apprécierais grandement toute aide que n'importe qui peut offrir.

Je vous remercie

L'erreur vous donne toutes les informations dont vous avez besoin:

La procédure ou la fonction 'spGET_Detail' attend le paramètre ' @DetailCategoryID ',

Mais vous avez dit

ParmName = @DetailID

Edit : Je viens de réaliser que vous utilisez le pilote ODBC pour vous connecter au server SQL. Le pilote ODBC utilise des points d'interrogation comme des espaces réservés de parameters, pas de parameters nommés. Donc, votre requête ne devrait pas avoir @ rien. Les parameters sont remplacés par ordre, pas par nom.

De: http://msdn.microsoft.com/en-us/library/bbw6zyha.aspx

La syntaxe des espaces réservés de parameters dépend de la source de données. Cet exemple montre des espaces réservés pour une source de données SQL Server. Utilisez les espaces réservés point d'interrogation (?) Pour les parameters System.Data.OleDb et System.Data.Odbc.

Cela dit, à less que vous ne vous connectiez à beaucoup d'autres types de bases de données, vous devriez probablement utiliser SqlClient, pas ODBC.

Utilisez ceci:

 his.DB_Comm.Parameters.AddWithValue("DetailCategoryID", 2); 

J'ai eu ce même problème – Exception a dit que le paramètre n'était pas là quand il était, indépendamment du '@' ou non dans le nom du paramètre.

Je l'ai résolu en définissant le type de command de l'object SqlCommand à StoredProcedure :

 DB_Comm.CommandType = CommandType.StoredProcedure; 

PS – Peu importe si vous avez le @ dans le nom du paramètre avec cette méthode. J'ai testé avec quelques @parameters et d'autres sans le même appel de sproc et cela a fonctionné.