繁体   English   中英

如何在ASP.NET中使用“ WHERE [列名] IN [值]”格式运行带有字符串值列表的SQL查询?

How can I run a SQL Query with a list of String values using the “WHERE [columnname] IN [values]” format in ASP.NET?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个SQL查询,我正在ASP.NET页中运行。 最终解析的SQL需要包含WHERE [columnname] IN [values]格式的字符串值列表。 例如,最终查询可能看起来像这样:

SELECT PRODUCTNAME FROM PRODUCT WHERE PRODUCTCODE IN ('ABC','DEF','GHI','JKL', /* etc */);

但是,WHERE子句中的字符串值必须是动态的。 通常,我使用参数化查询来使我的代码更加方便和安全,因此从概念上讲,我想执行以下操作:

String[] productCodes = { "ABC", "DEF", "GHI", "JKL" };
SqlCommand cmd = "SELECT PRODUCTNAME FROM PRODUCT WHERE PRODUCTCODE IN (@ProductCodes)";
cmd.Parameters.Add("@ProductCodes", productCodes);

但是,.NET中似乎不存在这种功能。 我应该如何实施呢? 我可以在数组上使用foreach循环,并使用单个值作为每个值的参数运行查询,但是数组中可能存在一百多个左右的不同值,看来分别查询它们效率很低。

我读过另一个问题,有人建议为强类型的int参数提供解决方案 ,但是当与String值一起使用时,该方法会让我对SQL注入感到不安,尤其是因为客户端很可能能够影响输入值。

您将如何实现此查询功能?

使用数据库详细信息进行编辑

该数据库是SQL Server2005。很抱歉忘记提及这一点。

4 个回复

创建基本sql语句为格式,并动态添加参数,然后在循环中设置值。

String[] productCodes = { "ABC", "DEF", "GHI", "JKL" };
string sqlFormat = "SELECT PRODUCTNAME FROM PRODUCT WHERE PRODUCTCODE IN ({0})";
var @params = productCodes.Select((id, index) => String.Format("@id{0}", index)).ToArray();
var sql = String.Format(sqlFormat, string.Join(",", @params));

using(var cmd = new DbCommand(sql))
{
    for (int i = 0; i < productCodes.Length; i++)
        cmd.Parameters.Add(new Parameter(@params[i], DbType.String, productCodes[i]));
    // execute query
}

只是一个想法:

String[] productCodes = { "ABC", "DEF", "GHI", "JKL" };
SqlCommand cmd = "SELECT PRODUCTNAME FROM PRODUCT WHERE PRODUCTCODE IN ("; 

for (int i=0;i<productCodes.Length;i++) {
  cmd.CommandText += "@" + productCodes[i] + ",";
  cmd.Parameters.Add("@" + productCodes[i], productCodes[i]);
}
cmd.CommandText = cmd.CommandText.SubString(0, cmd.CommandText.Length-1);
cmd.CommandText += ");"

可能不是最好的方法,但是我想这就是我会尝试的方法。

您正在寻找表值参数。 但是,直到asp.net被广泛采用之后,这些功能才可用于sql server,因此对asp.net的支持受到限制。

相反,我建议您将其视为构建购物车。 用户将项目添加到购物车,并且在某些时候您想要显示购物车中的所有项目。 在这种情况下,自然的解决方案是购物车本身位于数据库表中。 与其将卡中包含的项作为“ IN(?)”指令的一部分拉下来,您不如将其构建为指令的子查询:“ WHERE X IN (SELECT X FROM ShoppingCart WHERE UserID= @UserID AND SessionKey= @SessionKey) “。 即使您添加了数百个项目,用户也是如此之快,并且每个插入的负载相当均匀地分布。

当然,您可能正在构建购物车以外的东西,但是尽管如此,您的查询几乎总是属于以下三类之一:

  1. 列表中的项目由用户手动选择,在这种情况下,您仍然可以使每个选择结果都在新的数据库记录中,该记录又可以在子查询中使用
  2. 它是数据库中已经可用的数据,在这种情况下,您仍然应该可以使用子查询(如果不能,则可能是时候在某个地方添加“类别”列,以便可以使用了)。
  3. 这些数据已硬编码到您的应用中,在这种情况下,您也可以将其编码到查询中

罕见的例外是查询是由另一台机器源触发的,或者您可能还拥有很多不愿意重新编写代码以使之成为可能的代码。
因此,如果由于某种原因,这种方法不能为您解决问题,可以在以下位置找到有关sql server的标准文章(包括一些替代方法):
http://www.sommarskog.se/arrays-in-sql.html

本文确实是该主题的标准文章,非常值得您花时间。

作为记录,“不单独”查询数组中的一百个左右的值也可能效率不高(尽管不如往返SQL Server的一百个左右那样低效率)。 但是,参数化查询会有所帮助,因为您可以准备相同的查询并执行多次。 存储过程可能会更好。

您有机会可以使用Linq,还是您是.NET-3.5之前的版本?

如果您不能使用Linq,并且绝对必须使用此路线,请尝试以下操作:

SqlCommand cmd = "SELECT PRODUCTNAME FROM PRODUCT WHERE PRODUCTCODE = @ProductCode";
cmd.Prepare();
List<string> results;
foreach (string code in productCodes)
{
    cmd.Parameters.Clear();
    cmd.Parameters.Add("@ProductCodes", DbType.VarChar).Value = code;
    cmd.ExecuteQuery();
    // Add code here to add the returned values to the results list.  It's been
    // a while since I've used ADO.NET, and I don't have time to look it up
    // at the moment...
}

然后,您有结果列表。

1 清除重复的查询字符串值asp.net

我想使用查询字符串中的值创建和命名文件夹。 例如: 调试应用程序后(如下所示),我意识到我测试的每个请求都成为一个集合。 结果,我怀疑该文件夹名为(Collection)_(Collection)而不是查询字符串值lotid_operation 。 知道为什么会这样吗? ...

2 ASP.Net查询字符串-多个值

是否可以将多个值传递给单个Querystring参数? 这是我在想什么: 要么 这样的事情。 我确信我可以通过其他方式传递它们,并且可能会爆炸内部内容(对不起,.net术语会更好)。 但是我宁愿以一种可以通过类似于以下代码的方式轻松提取的方式执行此操作: ...

3 ASP.NET 字符串值作为查询命令

我有一个 asp.net 应用程序我有一个针对不同值的多个 sql 查询。 如何将字符串值添加到 sql 命令。 这是资源页面 @Kuzey.Resources.GeneralTitles.kapi1 ACIKLAMA=@Kuzey.Resources.GeneralTitles.kapi1 ...

4 在ASP.NET中使用查询字符串参数形成动态SQL语句

我正在尝试根据查询字符串参数动态创建MS SQL查询。 我当前正在使用要求任何有效查询字符串参数值的变量:如果参数不为空,则该变量构成SQL语句的一部分。 如果为空,则变量保持空白。 例如: 如果两个查询参数均有效,则此sql查询运行正常。 但是,如果搜索参数为空且价格不 ...

6 在ASP.NET中使用URL查询字符串

我刚接触ASP.NET,并想找到使用URL查询字符串的最佳方法。 我可以使用Request.QueryString["UrlKey"]来获取URL查询字符串的当前值,但实际上可以使用代码修改URL,而无需进行表单GET提交吗? 如果用户是第一次登陆页面,通过Page_load方法以编 ...

7 如何在C#中使用ASP.NET在SQL查询中使用隐​​藏字段作为值?

我正在为记录列表编写过滤器,并试图将过滤器条件传递到新页面的url中,然后使用该条件来填充MySQL中的SELECT查询中的条件。 但是,我不断提出一个问题,要么没有值输入查询,并且表没有被过滤,要么给了我一个空值。 这是我在URL中请求条件的第一段代码: 这是我在查询中使用值的代码部分: ...

8 如何在asp.net中将sql记录值分配给字符串

我是ASP新手,请耐心:p 我有一个sql数据库,带有一个具有用户名和颜色的users表。 我的asp主页正在读取当前用户的用户名,并将其传递给内容。 我现在想做的是在内容页面中,从sql表中抓取用户名为当前用户名的颜色,并将其分配给default.aspx.cs文件中的字符串。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM