2008-12-30 62 views
4

我想調用SQL語句,如:使用了SQL命令對象的「IN」運算符和C#2.0

Select * From Table Where Column in ('value1', 'value2', 'value3') 

是它設置等於命令參數的值,則簡單的「('value1', 'value2', 'value3')」 ?

+1

是否有打算只是3個值匹配或可能會更多? – 2008-12-30 16:55:22

回答

0

如果你只有在第三個參數則是你可以使用的參數。否則,你可以建立動態的SQL(小心的SQL注入攻擊)。

另一種方法是創建一個UDF這需要一個分隔的字符串,並返回一個表。那麼你可以修改您的查詢是:

select * from 
table inner join 
dbo.fn_stringToTable(@params) 
0

另一種選擇是設置的SqlCommand的命令類型爲「文本」,並構建整個代碼SQL字符串...假設列是一個varchar和你的價值觀在一個字符串arrray,名爲「paramValues」

 StringBuilder sbSql = new StringBuilder 
        ("Select * From Table Where Column in ("); 
     string[] paramValues = new string[] {"value1", "value2", "value3"}; 
     foreach (string val in paramValues) 
      sbSql.Append("'" + val + "', "); 
     sbSql = sbSql.Remove(sbSql.Length - 2, 2); 
     sbSql.Append(")"); 

     SqlCommand cmd = new SqlCommand(sbSql.ToString()); 
     cmd.CommandType = CommandType.Text; 
5

@Charles:你進入正確的方向,但我們使用參數化查詢主要防止SQL注入。在查詢中把硬編碼「外部」的值(params string[] args)是自找麻煩。您可以重複的論點,但你仍然有使用的參數是這樣的:

string[] values = new [] {"value1", "value2", "value3", "value4"}; 
    StringBuilder query = new StringBuilder("Select * From Table Where Column in ("); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = new SqlConnection("Your connection string"); 
    for(int i = 0; i < columns.Length; i++) 
    { 
     string arg = string.Format("@arg{0}", i); 
     cmd.Parameters.AddwithValue(arg, SanatizeSqlString(columns[i])); 
     sb.AppendFormat("{0}, ", arg); 
    } 
    sb = sb.Remove(sb.Length -2, 2); 
    sb.Append(")"); 
    cmd.CommandText = sb.ToString(); 

這樣你會像一個查詢結束:

select * from table where column in (@arg0, @arg1, @arg2, @arg3)