2016-08-29 1 views
0

Je suis vraiment déprimé à propos de cette erreur tout le code de fonction est correct mais toujours son me donnant l'erreur, j'essaye de sélectionner l'information de la base de données de SQL Server.Procédure ou fonction sp_select_companydetails a trop d'arguments spécifiés

procédure stockée:

create procedure sp_select_companydetails 
    @id varchar(5) 
as 
begin 
    select company_name, company_address 
    from CompanyDetails 
end 

code C#:

2) sur le bouton formulaire clic événement

string id = "1"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "sp_select_companydetails"; 
cmd.Parameters.Add("@id", id); 
FillDataset(); 

En classe

public DataSet FillDataset() 
{ 
    try 
    { 
     using (cmd) 
     { 
      DataSet ds = new DataSet(); 
      cmd.Connection = con; 

      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(ds); 

      cmd.Parameters.Clear(); 
      return ds; 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

Lorsque je clique sur le bouton de formulaire J'ai cette erreur:

Procedure or function sp_select_companydetails has too many arguments specified.

me suggérer une bonne solution

Nous vous remercions à l'avance

+0

Remarque: vous ne devez pas ** utiliser ** le préfixe 'sp_' pour vos procédures stockées. Microsoft a [réservé ce préfixe pour son propre usage (voir * Naming Stored Procedures *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), et vous courez le risque d'un conflit de noms dans le futur. [Il est également mauvais pour les performances de votre procédure stockée] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Il vaut mieux éviter simplement 'sp_' et utiliser autre chose comme préfixe - ou pas de préfixe du tout! –

Répondre

0

Au lieu d'utiliser un SqlCommand global, créez comme nouveau chaque fois que vous en avez besoin. Cette approche est recommandée lorsque vous traitez avec des objets jetables

using (SqlConnection con = new SqlConnection(GetConnectionString()) 
using (SqlCommand myCmd = new SqlCommand("sp_select_companydetails", con)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@id", SqlDbType.VarChar).Value = "1"; 
    DataSet ds = new DataSet(); 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    da.Fill(ds); 
    return ds; 
} 

Par ailleurs, nous ne pouvons pas voir comment créer SqlConnection, mais il semble que vous avez un autre objet jetable maintenu au niveau mondial. Ceci est particulièrement désagréable avec une SqlConnection parce que cet objet garde des références aux ressources du système à la fois sur le client et sur le serveur. Ne créez pas d'objets de connexion globaux, créez simplement une méthode globale qui renvoie la chaîne de connexion en cours à utiliser dans la création de SqlConnection locale (GetConnectionString() dans mon exemple ci-dessus). Si vous pensez que c'est un tueur de performance, je vous suggère de lire à propos de the concept of connection pooling

+0

Merci monsieur, oui vous avez raison je ne vais pas utiliser global sqlcommand, pouvez-vous s'il vous plaît suggérer une meilleure option :) –

+0

Comme indiqué dans le SqlCommand vous utilisez une variable locale également pour le SqlConnection. – Steve

+0

ok got it :) Merci .. –