C# 使用列表中的项目<;字符串>;在SQL查询中
好的,我有一个由sql查询中的一组值组成的列表,这部分工作正常。我想做的是使用该列表中的项目告诉另一个查询要查找什么。所以,它的意思是,它应该返回来自CMMReports的所有列,其中PartNumber类似于%listItem1..2…3%,有什么建议吗C# 使用列表中的项目<;字符串>;在SQL查询中,c#,sql,C#,Sql,好的,我有一个由sql查询中的一组值组成的列表,这部分工作正常。我想做的是使用该列表中的项目告诉另一个查询要查找什么。所以,它的意思是,它应该返回来自CMMReports的所有列,其中PartNumber类似于%listItem1..2…3%,有什么建议吗 List<string> ImportedParts = GetImportedPartNumbers(); string query = "SELECT * FROM CMMReports WHERE (RacfId IS N
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;";
List ImportedParts=getimportedpartnumber();
string query=“从CMMReports中选择*,其中(RacfId为NULL或RacfId='')和(文件路径不象'%js91162%'),零件号象%”+导入零件+%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());
我并不是宽恕这一点,因为您应该使用参数化查询。然而,这应该是可行的:
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;";
List ImportedParts=getimportedpartnumber();
SqlCommand cmd=myConnection.CreateCommand();
cmd.CommandText=“从CMMReports中选择*,其中(RacfId为NULL或RacfId='')和(文件路径与“%js91162%”不同)和(“;
int i=0;
foreach(导入部件中的字符串部件){
cmd.AddParameterWithValue(“@param”+i.ToString(),“%”部分+“%”);
如果(i!=0)cmd.CommandText+=“或”
cmd.CommandText+=“类似于@param的零件号”+i.ToString();
i++;
}
cmd.CommandText+=”)按CreatedOn DESC命令;”;
此解决方案使用参数化查询,而不只是在SQL中添加字符串,这被认为是一种潜在的安全风险。未经测试,但您应该了解:
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;";
List ImportedParts=getimportedpartnumber();
SqlCommand cmd=myConnection.CreateCommand();
cmd.CommandText=“从CMMReports中选择*,其中(RacfId为NULL或RacfId='')和(文件路径与“%js91162%”不同)和(“;
int i=0;
foreach(导入部件中的字符串部件){
cmd.AddParameterWithValue(“@param”+i.ToString(),“%”部分+“%”);
如果(i!=0)cmd.CommandText+=“或”
cmd.CommandText+=“类似于@param的零件号”+i.ToString();
i++;
}
cmd.CommandText+=”)按CreatedOn DESC命令;”;
此解决方案使用参数化查询,而不只是在SQL中添加字符串,这被认为是一种潜在的安全风险。您可以通过在SQL中查找clouse来获得SQL Server在数据库中可以找到的部分的答案。对所有项使用WHERE x=y意味着,如果找不到一个项,整个查询将不返回任何结果。您可以在查询中查找SQL,这样您就可以得到SQL Server在数据库中可以找到的部分的答案。在所有项目中使用x= y意味着如果找不到一个项目,整个查询就不会返回任何东西。 < P>我会考虑在存储过程中这样做,并将列表作为一个<代码> XML 参数传递。< /P> 有关在存储过程中使用Xml参数的详细信息,请参阅以下文章:
窗体,您可以使用XML语法轻松地在存储的PROC中使用列表数据,并将其视为另一个数据表。
< P>我会考虑在存储过程中这样做,并将列表作为一个<代码> XML 参数传递。 有关在存储过程中使用Xml参数的详细信息,请参阅以下文章:从那里,您可以使用Xml语法轻松地使用存储过程中的列表数据,并将其视为另一个数据表。您是否希望在单个记录中匹配列表中的每个项目?或者列表中的任何项目?您应该至少从执行参数化SQL查询开始,这样您就不会受到SQL注入攻击。那么,如果您已经有一个现有零件号列表,为什么要使用LIKE?LIKE是指当您要匹配字符串的一部分时:LIKE“%an”查找以LIKE“an%”结尾的每条记录查找以LIKE“%an%”开头的每条记录查找包含字符串的每条记录是否要在单个记录中匹配列表中的每一项?或者列表中的任何项目?您应该至少从执行参数化SQL查询开始,这样您就不会受到SQL注入攻击。那么,如果您已经有一个现有零件号列表,为什么要使用LIKE?LIKE是指当您要匹配字符串的一部分时:LIKE“%an”查找以LIKE“an%”结尾的每条记录查找以LIKE“%an%”开头的每条记录查找包含Ant的每条记录这与我需要的非常接近,但它会提供我和PartNumber(如值1)以及PartNumber(如值2)和PartNumber(如值3),我需要的是像value1一样的零件号,或者像value2一样的零件号,或者像value3一样的零件号。@jakesankey-更新了我的答案。这接近我需要的,但是它给了我像value1一样的零件号,像value2一样的零件号,像value3一样的零件号,我需要的是像value1一样的零件号或像value2一样的零件号或像value3一样的零件号。@jakesankey-更新了我的答案。