参数化查询与和在条件
-
08-07-2019 - |
题
参数化查询。净总是这样的例子:
SqlCommand comm = new SqlCommand(@"
SELECT *
FROM Products
WHERE Category_ID = @categoryid
",
conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;
但我跑进一个砖墙试图做到以下几点:
SqlCommand comm = new SqlCommand(@"
SELECT *
FROM Products
WHERE Category_ID IN (@categoryids)
OR name LIKE '%@name%'
",
conn);
comm.Parameters.Add("@categoryids", SqlDbType.Int);
comm.Parameters["@categoryids"].Value = CategoryIDs;
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = Name;
哪里
- CategoryIDs是一个逗号分开列表中的数字"123,456,789"(不引)
- 名字一串可能有单一的报价和其他的坏人物
什么是正确的语法?
解决方案
让我们说的,你有你的类别id在整数列和名称的是一串。关键是要创造的命令的案文,以允许你来进入所有类别的标识作为个人的参数和建造的模糊匹配的名称。要做到前,我们使用一个循环构建一个序列的参数名@p0通过@pN-1,其中N为数类别id数。然后我们建立参数,并将它添加到该命令相关的类别标识的价值为每名参数。然后我们用串联的名称查询本身允许的模糊搜索名称。
string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
1618, 1619, 1620, 1951, 1952,
1953, 1954, 1955, 1972, 2022 };
SqlCommand comm = conn.CreateCommand();
string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i++)
{
parameters[i] = "@p"+i;
comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",$"%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";
这是一个完全参数化的查询,应该让你的DBA高兴。我怀疑,因为这些都是整数,虽然这将不会有太大的安全风险,只是建造的命令的文本直接与价值观,同时还参数化的名称。如果你的类别标识字符串中的阵列,只是分裂的阵上逗号,转换成每个到整数,并将其存储在整数阵列。
注: 我说的阵列,使用它的例子,但是它应该工作的任何收集,虽然你迭代将可能有所不同。
原来的想法 http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9
其他提示
你需要"%"在值的sql参数。
SqlCommand comm = new SqlCommand("SELECT * FROM Products WHERE Category_ID IN (@categoryid1, @categoryid2) OR name LIKE @name", conn);
comm.Parameters.Add("@categoryid1", SqlDbType.Int);
comm.Parameters["@categoryid1"].Value = CategoryID[0];
comm.Parameters.Add("@categoryid2", SqlDbType.Int);
comm.Parameters["@categoryid2"].Value = CategoryID[1];
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = "%" + Name + "%";
这种方法不会的工作。期。
本条款预计一个清单参数本身,所以当你结合 一个 参数,你有机会通过在 一个 值。
建立你的发言串的动态,的确切数额的个别条款的占位你打算通过在,然后添加参数和结合的价值观,他们在一个循环。
不知道,如果这是正确的方式,但它是一种方法,我这样做之前
表templist=new列表
comm.参数。添加("@categoryids",SqlDbType.varchar);comm.参["@categoryids"].值=string.加入(",",templist.toarray())