2010-06-07 3 views
1

J'utilise VSTS 2008 + C# + .Net 3.5 + ADO.Net. Voici mon code et le message d'erreur associé. Le message d'erreur dit, @ Param1 n'est pas fourni, mais en fait il est fourni dans mon code. Des idées ce qui ne va pas?Erreur lors de l'appel de la procédure stockée avec le paramètre d'entrée de ADO.Net

System.Data.SqlClient.SqlException: paramètre procédure ou la fonction 'Pr_Foo' attend '@ Param1', qui n'a pas été fourni .

class Program 
{ 
     private static SqlCommand _command; 
     private static SqlConnection connection; 

     private static readonly string _storedProcedureName = "Pr_Foo"; 
     private static readonly string connectionString = "server=.;integrated Security=sspi;initial catalog=FooDB"; 

     public static void Prepare() 
     { 
      connection = new SqlConnection(connectionString); 
      connection.Open(); 
      _command = connection.CreateCommand(); 
      _command.CommandText = _storedProcedureName; 
      _command.CommandType = CommandType.StoredProcedure; 
     } 

     public static void Dispose() 
     { 
      connection.Close(); 
     } 

     public static void Run() 
     { 
      try 
      { 
       SqlParameter Param1 = _command.Parameters.Add("@Param1", SqlDbType.Int, 300101); 
       Param1.Direction = ParameterDirection.Input; 
       SqlParameter Param2 = _command.Parameters.Add("@Param2", SqlDbType.Int, 100); 
       portal_SiteInfoID.Direction = ParameterDirection.Input; 
       SqlParameter Param3 = _command.Parameters.Add("@Param3", SqlDbType.Int, 200); 
       portal_RoleInfoID.Direction = ParameterDirection.Input; 

       _command.ExecuteScalar(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 
     } 

     static void Main(string[] args) 
     { 
      try 
      { 
       Prepare(); 

       Thread t1 = new Thread(Program.Run); 
       t1.Start(); 
       t1.Join(); 

       Dispose(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message + "\t" + ex.StackTrace); 
      } 
     } 
    } 

Merci à l'avance,

George

+1

Vous semblez avoir aseptisé votre code pour l'affichage regardant les noms des paramètres incompatibles. Je soupçonne que votre aseptisation du code a caché le problème réel. Pouvez-vous vérifier ce que vous avez fait? –

+0

Que voulez-vous dire "vérifiez ce que vous avez fait"? Appréciez si vous pouviez fournir plus de détails sur ce qu'il faut vérifier? :-) – George2

+1

vous avez 'SqlParameter Param2 = _command .....' et ensuite la ligne suivante indique 'portal_SiteInfoID.Direction = ....' - est-ce supposé être le même paramètre 'Param2' ?? –

Répondre

2

Essayez de remplacer votre fonction par le code ci-dessous et vérifiez:

public static void Run() 
     { 
      try 
      { 
       _command.Parameters.AddWithValue("@Param1", 300101); 
       _command.Parameters.AddWithValue("@Param2", 100); 
       _command.Parameters.AddWithValue("@Param3", 200); 

       _command.ExecuteScalar(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 
     } 
+0

Merci, votre solution fonctionne! – George2

1

Essayez de prendre le symbole "@" de vos déclarations • Ajoutez. Je ne préfixerai jamais le @ lors de l'ajout de paramètres.

Par exemple:

SqlParameter Param1 = _command.Parameters.Add("Param1", SqlDbType.Int, 300101); 
+0

J'ai essayé mais le même problème. D'autres idées? – George2

+0

J'ai également essayé d'exécuter la procédure de magasin à partir de SSMS et fournir les mêmes paramètres manuellement à partir de l'interface graphique, il fonctionne avec succès. – George2

2

Vous n'avez pas ajouter de la valeur au paramètre. La signature de Add est Add (string parameterName, type SqlDbType, taille int) ... le dernier paramètre est la taille, pas la valeur. vous pouvez utiliser la méthode AddWithValue.

MSDN Article

+0

Cool, merci l'homme! – George2

Questions connexes