SqlParameter和IN语句

我需要以下查询:

createList(string commaSeparatedElements) { ... SqlCommand query = new SqlCommand("SELECT * FROM table WHERE id IN ("+commaSeparatedElements+")"); ... } 

我想使用参数化查询来编写它,因此检查字符串中的每个元素以防止Sql-Injections。

伪代码:

 createList(string commaSeparatedElements) { ... SqlParameterList elements = new SqlParameterList("@elements", SqlDbType.Int); SqlParameterList.Values = commaSeparatedElements.split(new Char[1] {','}); SqlCommand query = new SqlCommand("SELECT * FROM table WHERE id IN (@elements)"); query.Parameters.Add(elements); ... } 

C#中是否存在类似的内容,或者我必须自己编写?

编辑:谢谢你的所有答案。 当我尽量不使用代码时,我不理解(在过去的日子里有太多糟糕的经历),精致和表值参数,即使它们可能完全满足我的需求,也是禁止的。 我刚做了一个循环。

 string[] elements = commaSeparatedElements.split(new Char[1] {','}); StringList idParamList = new StringList(); for(int i=0;i<elements.Count;i++) { query.Parameters.AddWithValue("@element"+i,Convert.ToInt32(elements[i])); idParamList.Add("@element" + i); } SqlCommand query = new SqlCommand("SELECT * FROM table WHERE id IN ("+String.Join(",",idParamList)+")"); 

我使用像这样的辅助方法

 ///  /// Adds a sequence of parameters to an existing parameter collection ///  /// Type of parameter values /// Existing parameter collection /// Name pattern of parameters. Must be a valid  format string /// Database type of parameters /// Length of parameter. 0 for numeric parameters /// Sequence of values /// Comma separated string of parameter names public static string AddParameters(SqlParameterCollection parameters, string pattern, SqlDbType parameterType, int length, IEnumerable values) { if (parameters == null) throw new ArgumentNullException("parameters"); if (pattern == null) throw new ArgumentNullException("pattern"); if (values == null) throw new ArgumentNullException("values"); if (!pattern.StartsWith("@", StringComparison.CurrentCultureIgnoreCase)) throw new ArgumentException("Pattern must start with '@'"); var parameterNames = new List(); foreach (var item in values) { var parameterName = parameterNames.Count.ToString(pattern, CultureInfo.InvariantCulture); parameterNames.Add(parameterName); parameters.Add(parameterName, parameterType, length).Value = item; } return string.Join(",", parameterNames.ToArray()); } 

它像这样使用

 string sql = "SELECT col1 " + "FROM Table " + "WHERE col2 IN ({@Values}) "; var paramNames = SqlHelper.AddParameters(command.Parameters, "@Value0", SqlDbType.Int, 0, listOfInts); command.CommandText = sql.Replace("{@Values}", paramNames); ... 

(结果是SELECT ... IN (@Value0, @Value1, @Value2) )之类的查询

“dapper”有一些伏都教:

 var ids = new List {1,2,3,4,5}; var rows = conn.Query("select * from table where id in @ids", new { ids }).ToList(); 

您会注意到使用中缺少括号; “dapper”发现了这一点,并自动执行参数扩展。 此外,它还会为您处理所有命令详细信息,包括将数据映射回SomeType实例。

在上面的例子中,它将扩展为等于(近似):

 int ids0 = 1, ids1 = 2, ids2 = 3, ids3 = 4, ids4 = 5; var rows = conn.Query( "select * from table where id in (@ids0,@ids1,@ids2,@ids3,@ids4)", new { ids0, ids1, ids2, ids3, ids4 }).ToList(); 

SQL Server有一个数据结构,非常适合保存相同“类型”的多个值 – 这就是一个表。

值得庆幸的是,近年来,他们引入了表值参数,以便您可以在客户端代码中构造一个表,并以自然的方式将其传递给SQL Server,例如:

 // Assumes connection is an open SqlConnection. using (connection) { // Create a DataTable with the modified rows. DataTable addedCategories = CategoriesDataTable.GetChanges( DataRowState.Added); // Define the INSERT-SELECT statement. string sqlInsert = "INSERT INTO dbo.Categories (CategoryID, CategoryName)" + " SELECT nc.CategoryID, nc.CategoryName" + " FROM @tvpNewCategories AS nc;" // Configure the command and parameter. SqlCommand insertCommand = new SqlCommand( sqlInsert, connection); SqlParameter tvpParam = insertCommand.Parameters.AddWithValue( "@tvpNewCategories", addedCategories); tvpParam.SqlDbType = SqlDbType.Structured; tvpParam.TypeName = "dbo.CategoryTableType"; // Execute the command. insertCommand.ExecuteNonQuery(); } 

如果你宣布

 List Ids = new List(); 

并添加你想要的ID。 可以很容易地将它转换为逗号分隔列表,如下所示

 string listOfIds = string.Join(",", Ids.Select(Id => Id.ToString()).ToArray()); 

然后将此字符串作为参数传递给参数化查询。

你正在使用哪个版本的sql server? 如果您使用的是sql server 2008或更高版本,则应该尝试使用表值参数

检查http://www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters

使用ADO.Net传递表值参数

这就是我在一个项目中所做的:

  StringBuilder sb = new StringBuilder("Id IN("); List parameters = new List(); int i = 1; foreach (int item in items) { string currentItem = "@Item" + i++.ToString(); sb.Append(currentItem + ","); parameters.Add(new SqlParameter(currentItem , item)); } sb.Remove(sb.Length-1, 1); sb.Append(")"); 

我希望这有帮助

或者,您可以为参数设置if条件。 例如:

 if(commaSeparatedElements.Contains("'")) return; else //Pass parameter & Execute query