2017-08-03 15 views
-1

を私は実行時エラーを持っている:がスカラー変数を宣言しなければなりません「@ManagerID」

: は、私はすべての私のクラスの変数やマイProcudure 私のクラスコードを宣言しましマネージャーID イム@スカラー変数\ "は確かに宣言する必要があります
public DataTable Select(int ID,string NameFa, string Address, int ManagerID, short TotalUnits, int ChargeMethodID) 
{ 
    DataTable table = new DataTable(); 
    table.Columns.Add("ID", typeof(int)); 
    table.Columns.Add("NameFa", typeof(string)); 
    table.Columns.Add("Address", typeof(string)); 
    table.Columns.Add("ManagerID", typeof(int)); 
    table.Columns.Add("TotalUnits", typeof(short)); 
    table.Columns.Add("ChargeMethodID", typeof(int)); 

    try 
    { 
     con.Open(); 
     SqlCommand command = new SqlCommand("dbo.SelectBuilding", con); 
     command.CommandType = CommandType.StoredProcedure; 
     command.Parameters.Add(new SqlParameter("@ID", ID)); 
     command.Parameters.Add(new SqlParameter("@NameFa", NameFa)); 
     command.Parameters.Add(new SqlParameter("@Address", Address)); 
     command.Parameters.Add(new SqlParameter("@ManagerID", ManagerID)); 
     command.Parameters.Add(new SqlParameter("@TotalUnits", TotalUnits)); 
     command.Parameters.Add(new SqlParameter("@ChargeMethodID", ChargeMethodID)); 
     SqlDataAdapter adapter = new SqlDataAdapter(command); 
     adapter.Fill(table); 
     return table; 
    } 

そして私Procudureコードです:

@ID int, 
@NameFa nvarchar(150), 
@Address nvarchar(MAX), 
@ManagerID int, 
@TotalUnits smallint, 
@ChargeMethodID int 
As 
    Begin 
     IF(@ID >0) 
      Begin 
       Select ID,NameFa,Address,ManagerID,TotalUnits,ChargeMethodID From Buildings where ID = @ID 
      End 
     ELSE 
      Begin 
       Declare @sqlTxt nvarchar(MAX) 
       SET @sqlTxt = 'SELECT ID,NameFa,Address,ManagerID,TotalUnits,ChargeMethodID FROM Buildings where ID>0' 
       IF(@NameFa!= null) 
       BEGIN 
        SET @sqlTxt = @sqlTxt + ' AND NameFa Like ''%@NameFa%''' 
       END 
       IF(@Address!= null) 
       BEGIN 
        SET @sqlTxt = @sqlTxt + ' AND Address Like ''%@Address%''' 
       END 
       IF(@ManagerID > 0) 
       BEGIN 
        SET @sqlTxt = @sqlTxt + ' AND ManagerID = @ManagerID' 
       END 
       IF(@TotalUnits > 0) 
       BEGIN 
        SET @sqlTxt = @sqlTxt + ' AND TotalUnits = @TotalUnits' 
       END 
       IF(@ChargeMethodID > 0) 
       BEGIN 
        SET @sqlTxt = @sqlTxt + ' AND ChargeMethodID = @ChargeMethodID' 
       END 
       EXEC (@sqlTxt); 
      End 
    END 

そして、私は選択機能を使用したい:

DataTable dt = new DataTable(); 
    Buildings.Building bb = new Buildings.Building() {ID=0,NameFa="",Address="",ManagerID=OwnerID,TotalUnits=0,ChargeMethodID=0 }; 
    dt = bu.Select(bb.ID,bb.NameFa,bb.Address,bb.ManagerID,bb.TotalUnits,bb.ChargeMethodID); 

そしてこれを解決するには? ( あなたの投稿は主にコードであると思われますので、詳細を追加してください)。

+0

実行時にOWNERIDの値は何ですか? – user2657943

+1

'あなたの投稿は主にコードであるようです。いくつかの詳細を追加してください '。 –

+0

この値を持つビルドExcives SQL Serverでテストしますが、Procudureで実行されません。 –

答えて

1

execステートメントにパラメータを渡していません。私はsp_executesqlに変更します。これには、パラメータを持つオプションの引数があります。

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql

編集:私は強くexecおよび/またはsp_executesqlコマンドを取り除くことをお勧めします。入力に応じて:

a)ユーザーが有効な入力としてSQL文字列区切り文字を入力するため、ランタイムエラーが発生します。姓としてのオハラの例。

b)悪意のあるユーザーがデータベースに悪影響を与える可能性があります。

あなたは、より簡単な方法で同様の結果を得ることができます:

Select 
    ID,NameFa,Address,ManagerID,TotalUnits,ChargeMethodID 
From 
    Buildings 
where 
    (@Id = 0 or ID = @Id) 
    and (@NameFa = '' or NameFa = @NameFa) 
    and (@ManagerID = 0 or ManagerID = @ManagerID) 
    // repeat for the rest of the optional search conditions 
関連する問題