2016-05-31 1 views
0

Il y a tellement de questions sur SO sur cette exception. Mais aucun d'eux ne m'a été utile.Procédure ou fonction a trop d'arguments spécifiés

Voici ma procédure stockée:

CREATE PROCEDURE HolidayStandardMappingInsert 
    @HolidayID bigint, 
    @StandatdID smallint 
AS 
BEGIN 
    INSERT INTO HolidayStandardMapping VALUES(@HolidayID,@StandatdID) 
END 
GO 

Et voici mon code:

int StdId = 0; 
       SqlCommand cmdS = new SqlCommand("HolidayStandardMappingInsert", conn); 
       cmdS.CommandType = CommandType.StoredProcedure; 


       for (int i = 0; i < cblStandard.Items.Count; i++) 
       { 
        if (cblStandard.Items[i].Selected == true) 
        { 
         if (StdId == 0) 
          StdId = Convert.ToInt32(cblStandard.Items[i].Value); 
         else 
          StdId = Convert.ToInt32(cblStandard.Items[i].Value); 
         cmdS.Parameters.AddWithValue("@HolidayID", NewRecordID); 
         cmdS.Parameters.AddWithValue("@StandatdID", StdId); 
         if (conn.State == ConnectionState.Open) 
         { 
          conn.Close(); 
         } 
         conn.Open(); 
         int res = cmdS.ExecuteNonQuery(); 
         if (res > 0) 
         { 

         } 
        } 
       } 

Dites-moi ce qui manque?

+1

Vous lisez les paramètres chaque fois que vous entrez une boucle 'for'. Vous devez soit supprimer à chaque fois, soit créer 'SqlCommand' dans la boucle' for'. –

Répondre

3

Vous utilisez le même SqlCommnad object pour des insertions multiples, donc previously ajouté parameters sont également présents.

Créez donc une nouvelle boucle interne SqlCommnad object ou des paramètres précédents clear.

Voici comment vous pouvez Clear Paramètres précédemment ajoutés.

cmdS.Parameters.Clear(); 
2

Vous ajoutez des paramètres dans une boucle. Donc, après la deuxième itération, votre commande a 4 paramètres.

0

Chaque fois que vous ajoutez cmdS.Parameters.AddWithValue dans une boucle. Donc après la première itération, il y a déjà 2 paramètres.

Vous devez effacer les paramètres de la commande avec cmdS.Parameters.Clear() avant d'entrer dans la boucle.