2010-07-13 47 views
1

好的,我有一个列表,它包含一组来自sql查询的值,该部分工作正常。我想要做的是使用该列表中的项目告诉另一个查询要查找什么。所以,它说的是,它应该返回CMMReports的所有列,其中PartNumber就像%listItem1..2 ... 3%,任何建议?在SQL查询中使用列表<string>中的项目

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;"; 
+1

您是否希望在单个记录中匹配列表中的每个项目?或列表中的任何项目? – 2010-07-13 15:33:19

+1

您应该至少从参数化的SQL查询开始,这样您就不会遇到SQL注入攻击。 – bkaid 2010-07-13 15:34:24

+0

所以如果你已经有一个现有的部件号列表,你为什么使用LIKE? LIKE是当你想匹配字符串的一部分时: 就像“%an”查找AN中的每个记录,结果为 LIKE“an%”查找AN中开始的每个记录 LIKE“%an%”查找每条记录包含一个 – Leslie 2010-07-13 15:57:19

回答

1

不是我宽恕这一点,因为你应该使用参数化查询。然而,这应该工作:

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()); 
+0

这是接近我所需要的,但它给了我和PartNumber LIKE value1和PartNumber LIKE value2和PartNumber LIKE value3,我需要的是和PartNumber像value1或PartNumber像value2或PartNumber像value3。 – 2010-07-13 17:19:55

+0

@jakesankey - 更新了我的答案。 – GenericTypeTea 2010-07-13 18:04:53

0

未经检验的,但你应该得到的想法:

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中,这被认为是一个潜在的安全使用参数化查询,而不是只追加字符串风险。

0

您可以通过这种方式查找IN clouse,以便获得SQL Server可以在数据库中找到的部分的答案。对所有项目使用WHERE x = y表示如果找不到一个项目,则整个查询将不返回任何内容。

相关问题