2014-08-28 47 views
1

我要參數這個在:參數化多或查詢的WHERE子句

select * from myTable where column1='1' or TaxRateRef='18'

弄成這個樣子:

String query = "select * from myTable where "; // column1='1' or column1='18' 

var parameters = new List<SqlParameter>(); 

for(int i = 0; i < data.Rows.Count;i++) 
{ 
    blah blah blah 

    query += " Column1='@column1' or"; 

    parameters.Add(new SqlParameter("@column1", i)); 

} 

但是我得到一個異常

System.Data.SqlClient.SqlException :The variable name '@column1' has already been declared.Variable names must be unique within a query batch or stored procedure. 
Incorrect syntax near 'or'. 
+0

你能向我們展示在形成查詢後執行的代碼嗎? – Raghu 2014-08-28 04:21:33

回答

2

錯誤很明顯。您在for循環中多次添加參數。您應該添加此行...

parameters.Add(new SqlParameter("@column1", i)); 

只在您的查詢一次。如果您需要在每次循環添加不同的值,只需追加迭代次數(i)參數名,以使其獨特...

query += string.Format(" Column1='@column1{0}' or", i); 
parameters.Add(new SqlParameter(string.Format("@column1{0}", i), i)); 
+0

是的 - 雖然我想那時不需要「1」。 ;) – 2014-08-28 04:30:09

+0

@RobFarley絕對。我只是複製/粘貼......關鍵是'parameters.Add'在sql批處理中聲明瞭一個新參數,並且參數名稱在批處理中必須是唯一的......這就像在'C#'中用相同名稱聲明兩個變量在同一範圍內 – Leo 2014-08-28 05:28:11

+0

是的。你的代碼是有效的 - 當你的評論出現時,我寫的類似。但後來我注意到這個「1」仍然在那裏,我想我會指出,以防萬一OP令人困惑。 – 2014-08-28 06:20:19

1

原因是因爲@column1所有附加時間。使用下面的一個

parameters.Add(new SqlParameter(string.Format("@column1{0}", i), i)); 

String query = "select * from myTable where "; // column1='1' or column1='18' 

var parameters = new List<SqlParameter>(); 

for(int i = 0; i < data.Rows.Count;i++) 
{ 
    blah blah blah 

    query += " Column1='@column1' or"; 

    parameters.Add(new SqlParameter("@column1", i)); 
    parameters.Add(new SqlParameter(string.Format("@column1{0}", i), i)); 

}