簡體   English   中英

使用清單中的項目 <string> 在SQL查詢中

[英]Using items from List<string> in SQL query

好的,我有一個列表,其中包含一堆來自sql查詢的值,該部分工作正常。 我要做的是使用該列表中的項目來告訴另一個查詢要查找的內容。 所以,這就是說,它應該返回CMMReports中的所有列,其中PartNumber類似於%listItem1..2 ... 3%,有什么建議嗎?

List<string> ImportedParts = GetImportedPartNumbers();

string query = "SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') AND (FilePath NOT LIKE '%js91162%') AND PartNumber LIKE %" + ImportedParts + "% ORDER BY CreatedOn DESC;";

並不是我寬恕了這一點,因為您應該使用參數化查詢。 但是,這應該起作用:

StringBuilder partNumbers = new StringBuilder();
foreach (string queryValue in ImportedParts)
{
    string q = "PartNumber LIKE '%" + queryValue + "%'";
    if (string.IsNullOrEmpty(partNumbers.ToString())
    {
       partNumbers.Append(q);
    }
    else
    {
       partNumbers.Append(" OR " + q);
    }
}

string query = string.Format("SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') " +
           "AND (FilePath NOT LIKE '%js91162%') AND ({0}) " +
           "ORDER BY CreatedOn DESC;", partNumbers.ToString());

未經測試,但是您應該知道:

List<string> ImportedParts = GetImportedPartNumbers(); 

SqlCommand cmd = myConnection.CreateCommand();
cmd.CommandText = "SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') AND (FilePath NOT LIKE '%js91162%') AND (";

int i = 0;
foreach (string part in ImportedParts) {
    cmd.AddParameterWithValue("@param" + i.ToString(), "%" + part + "%");
    if (i != 0) cmd.CommandText += " OR"
    cmd.CommandText += " PartNumber LIKE @param" + i.ToString();
    i++;
}

cmd.CommandText += ") ORDER BY CreatedOn DESC;";

此解決方案使用參數化查詢,而不只是在SQL中附加字符串,這被認為是潛在的安全風險。

您可以通過這種方式查找SQL的IN語言,以獲取SQL Server在數據庫中可以找到的部分的答案。 對所有項目使用WHERE x = y意味着如果找不到一項,則整個查詢將不返回任何內容。

我會考慮在存儲過程中執行此操作,並將您的列表作為Xml參數傳遞。

有關在存儲過程中使用Xml參數的更多信息,請參見以下文章:

使用XML參數將列表傳遞給SQL Server 2005-Jon Galloway

從那里開始,您可以使用Xml語法輕松地在存儲的proc中使用列表數據,並將其幾乎視為另一個數據表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM