OQL中对于IN查询的支持方式

Coordinator
Oct 12, 2012 at 6:15 AM

  用参数化查询是避免SQL注入的最佳方法,但是IN查询确不能很好的支持参数化查询,这个问题在

Sql Server参数化查询之where in和like实现详解

文章里面有很好的讨论,给了几种方案。OQL现在对于IN查询的支持是拼接的字符串,但这样会有SQL注入风险,所以跟大家讨论下改善方案。

一般来说IN的值不会太多,我赞成使用前面链接文章里面讨论的3号方案,这样简单有效,而且其它数据库也支持:

方案3 为where in的每一个参数生成一个参数,写法上比较麻烦些,传输的参数个数有限制,最多2100个,可以根据需要使用此方案(推荐)

复制代码
using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    SqlCommand comm = new SqlCommand();
    comm.Connection = conn;
    //为每一条数据添加一个参数
    comm.CommandText = "select * from Users(nolock) where UserID in (@UserID1,@UserId2,@UserID3,@UserID4)";
    comm.Parameters.AddRange(
    new SqlParameter[]{                        
        new SqlParameter("@UserID1", SqlDbType.Int) { Value = 1},
        new SqlParameter("@UserID2", SqlDbType.Int) { Value = 2},
        new SqlParameter("@UserID3", SqlDbType.Int) { Value = 3},
        new SqlParameter("@UserID4", SqlDbType.Int) { Value = 4}
    });

    comm.ExecuteNonQuery();
}
复制代码