我想調用SQL語句,如:使用了SQL命令對象的「IN」運算符和C#2.0
Select * From Table Where Column in ('value1', 'value2', 'value3')
是它設置等於命令參數的值,則簡單的「('value1', 'value2', 'value3')
」 ?
我想調用SQL語句,如:使用了SQL命令對象的「IN」運算符和C#2.0
Select * From Table Where Column in ('value1', 'value2', 'value3')
是它設置等於命令參數的值,則簡單的「('value1', 'value2', 'value3')
」 ?
如果你只有在第三個參數則是你可以使用的參數。否則,你可以建立動態的SQL(小心的SQL注入攻擊)。
另一種方法是創建一個UDF這需要一個分隔的字符串,並返回一個表。那麼你可以修改您的查詢是:
select * from
table inner join
dbo.fn_stringToTable(@params)
另一種選擇是設置的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;
@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)
是否有打算只是3個值匹配或可能會更多? – 2008-12-30 16:55:22