2016-08-29 35 views
0

私は実際にこのエラーについてうっかりしていますが、すべての関数コードは正しいですが、それでもエラーが出て、SQL Serverデータベースから情報を選択しようとしています。プロシージャまたは関数sp_select_companydetailsの引数が多すぎます

ストアドプロシージャ:

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

C#コード:

2)フォームのボタンクリックイベントでクラスで

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

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; 
    } 
} 

私は、フォームのボタンをクリックしてください私はこのエラーを受け取ります:

Procedure or function sp_select_companydetails has too many arguments specified.

は私に良い解決策を提案する

はあなたがそれを必要とする新しい毎回のように、それを作成する代わりに、グローバルSqlCommandオブジェクトを使用して、事前に

+0

を読むことをお勧めします。注意:**あなたのストアドプロシージャのプレフィックス 'sp_'を使用しないでください。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –

答えて

0

、ありがとうございました。あなたは使い捨てのオブジェクトところで

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; 
} 

を扱うとき、これは、我々はあなたがSqlConnectionオブジェクトを作成するにはどうすれば見ることができません推奨されるアプローチであるが、あなたが別の使い捨てのオブジェクトがグローバルレベルに保たれていることと思われます。このオブジェクトは、クライアントとサーバーの両方でシステム全体のリソースへの参照を保持しているため、SqlConnectionでは特に厄介です。グローバル接続オブジェクトを作成しないでください。ローカルのSqlConnection(上記の例ではGetConnectionString())の作成に使用する現在の接続文字列を返すグローバルメソッドを作成してください。これがパフォーマンスのキラーだと思う場合は、the concept of connection pooling

+0

ありがとう、ありがとう、私はグローバルsqlcommandを使用するつもりはない、あなたはより良いオプションを提案してください:) –

+0

SqlCommandに示されているように、SqlConnectionにもローカル変数を使用します。 – Steve

+0

okありがとうございました:)ありがとう.. –

関連する問題