咨詢區(qū)
.NET 中的參數(shù)化查詢我一直都像下面這樣寫(xiě)。
SqlCommand comm = new SqlCommand(@"
SELECT *
FROM Products
WHERE Category_ID = @categoryid
",
conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;
但我現(xiàn)在遇到了一個(gè)困難,參考如下代碼:
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.NVarChar);
comm.Parameters["@name"].Value = Name;
where條件中:
CategoryIDs
是一個(gè)以逗號(hào)隔開(kāi)的字符串 123,456,789
。
Name
是一個(gè)字符串,也有可能是包含了特殊字符。
目前的參數(shù)化無(wú)法查詢,請(qǐng)問(wèn)正確的語(yǔ)法如何寫(xiě)?
回答區(qū)
這里我逐一回答下你的問(wèn)題。
1. CategoryIds
這里我假定 CategoryIds
是一個(gè) int 類型的數(shù)組,正確的做法是將 int 數(shù)組中的所有元素打散,然后逐一 參數(shù)化
,比如可以在循環(huán)中構(gòu)建一個(gè) @p0 - @pN-1
的有序參數(shù),這里的 N 就是 CategoryIds 數(shù)組索引,然后逐一添加到 Command.Parameters
中。
2. Name
對(duì) Name
的模糊匹配,應(yīng)該放在 Parameters
參數(shù)上,而不是 SQL 中。
參考如下代碼:
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";
點(diǎn)評(píng)區(qū)
這是初學(xué)者在用 sql 參數(shù)化查詢時(shí)經(jīng)常遇到的問(wèn)題,有必要摘出來(lái)和大家分享下,如果有條件,建議看看 Dapper 的源碼,別人是如何處理此類場(chǎng)景的。
該文章在 2024/11/25 11:07:50 編輯過(guò)