Une requête SQL indique qu’un paramètre n’est pas fourni, mais qu’il est ajouté à l’object SqlCommand.

J’ai une procédure stockée qui a un paramètre appelé UserName et dans mon code derrière j’ai un object SqlCommand auquel j’ajoute les parameters avec la méthode Add. Mais pour une raison quelconque, lorsque l’object de commande tente d’exécuter la méthode ExecuteReader, il lève une exception. Je suis totalement désemparé et je ne sais pas pourquoi il ne reconnaît pas le paramètre. Avant que la méthode ExecuteReader ne soit exécutée, un point d’arrêt est défini afin de pouvoir confirmer que l’object de commande contient les parameters définis, ce qui est true. Je sais que la procédure stockée renvoie les données correctes lorsque les parameters ne sont pas ajoutés à l’object de commande, mais sont codés en dur dans la procédure stockée réelle. Vous trouverez ci-dessous le message d’exception indiqué dans le bloc catch. Je vais également coller mon code et la première partie de la procédure stockée. J’apprécierais grandement toute aide dans ce domaine, étant donné que j’ai essayé de nombreuses approches différentes sans succès. Merci d’avance.

Message d’exception

La procédure ou la fonction ‘someStoredProcedure’ attend le paramètre ‘@UserName’, qui n’a pas été fourni.

Code derrière

private DataTable GetLossMitData(ssortingng code, DateTime? start, DateTime? end) { DataTable results = new DataTable(); ssortingng connectionSsortingng = ConfigurationManager.ConnectionSsortingngs["asdf"].ConnectionSsortingng; ssortingng userName = Ssortingng.Empty; try { using (SPSite site = new SPSite(ConfigurationManager.AppSettings["someName"])) { using (SPWeb web = site.OpenWeb()) { userName = web.CurrentUser.Email.ToSsortingng(); } } using (SqlConnection connection1 = new SqlConnection(connectionSsortingng)) { connection1.Open(); using (SqlCommand command1 = new SqlCommand("someStoredProcedure", connection1)) { command1.Parameters.Add(new SqlParameter("@UserName", userName)); command1.Parameters.Add(new SqlParameter("@ProductCode", code)); SqlDataReader dr = command1.ExecuteReader(CommandBehavior.CloseConnection); results.Load(dr); } connection1.Close(); } } catch (Exception ex) { } return results; } 

Procédure stockée

 @UserName nvarchar(256), @ProductCode nvarchar(256), @StartDate nvarchar(256) = '1/1/1900', @EndDate nvarchar(256) = '12/30/2012' AS BEGIN SET NOCOUNT ON; Declare @UserID int Select @UserID = Users.UserID from Users where Users.Email = @UserName 

Essayez de vous assurer que le type de commande est défini sur procédure stockée.

 mycommand.CommandType = System.Data.CommandType.StoredProcedure; 

Vous obtiendrez cette exception si la valeur de votre variable ‘userName’ est null

Si la valeur null est valide, transmettez plutôt «DBNull.Value» à la firebase database:

 command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value)); 
 Command1.CommandType = System.Data.CommandType.StoredProcedure 

Cela forcera ExecuteReader à exécuter le exec au lieu de simplement l’essayer en tant que commande plate.

Par défaut, la propriété CommandText doit contenir une commande SQL complète, pas seulement le nom de la procédure stockée.

Vous pouvez modifier cela en définissant la propriété CommandType la SqlCommand sur StoredProcedure .

Vous pouvez également explicitement passer les parameters en modifiant le CommandText en "someStoredProcedure @UserName, @ProductCode" ; Il s’agit d’une instruction SQL complète qui fonctionnera avec le type de Text CommandType par défaut.

EDIT : Je viens de l’essayer, et le seul moyen d’obtenir ce message d’erreur sans définir CommandType sur StoredProcedure (ce qu’il n’a pas fait) est si CommandText est EXEC someStoredProcedure . Passer un paramètre null génère une erreur différente.