使用IN运算符和存储过程参数
我正在ASP.NET 2.0中构建一个网站,我正在处理的页面的一些描述:ListView显示来自我的访问数据库的一个表(post),以及一个用于过滤行的多选模式的ListBox(按论坛名称,值= forumId)。 我正在将ListBox选定的值转换为List,然后运行以下查询。
参数:
OleDbParameter("@Q",list.ToString());
程序:
SELECT * FROM sp_feedbacks WHERE forumId IN ([@Q])
问题是,它不起作用。 即使我使用字符串1,4,“1”,“4”或“1,4”从MSACCESS 2007运行它,我也得到零结果。 只有一个论坛被选中时,查询才有效。 (例如在(1)中)。
在此先感谢BBLN。
当你有:
col in ('1,4')
这测试col等于字符串'1,4'
。 它没有单独测试这些值。
解决这个问题的一种方法是使用:
where ','&@Q&',' like '*,'&col&',*'
我们的想法是为每个字符串添加分隔符。 因此,值“1”在列中变为“,1”。 @Q的值“1,4”变为“,1,4”。 现在进行比较时,“1”不会与“10”匹配。
注意(对于那些不知道的人)。 like
的通配符是*
而不是SQL标准%
。 但是,根据您的连接方式,这可能会有所不同,因此请使用相应的通配符。
我在这里看到2个问题:1)list.ToString()没有达到预期的效果。 试试这个:
List foo = new List (); foo.Add(1); foo.Add(4); string x = foo.ToString();
“x”的值为“System.Collections.Generic.List`1 [System.Int32]”而不是“1,4”要创建逗号分隔列表,请使用string.Join()。
2)OleDbParameter不理解数组或列表。 你必须做点别的事。 让我解释:
假设您成功使用string.Join()来创建参数。 生成的SQL将是:
SELECT * FROM sp_feedbacks WHERE forumId IN ('1,4')
OLEDB提供程序知道字符串必须在它们周围有引号。 这是为了保护您免受SQL注入攻击。 但是你不想传递一个字符串:你想传递一个数组或一个文字未更改的值来进入SQL。
你并不是第一个提出这个问题的人,但我担心OLEDB没有一个很好的解决方案。 如果是我,我会完全丢弃OLEDB并使用动态SQL。 但是,谷歌搜索“参数化SQL数组”在Stack Overflow上产生了一些非常好的解决方案:
在哪里(ID数组)
将一组参数传递给存储过程
祝好运! 发布你的方法!
将这样的条件传递给查询一直是个问题。 对于存储过程而言,它更糟糕,因为您甚至无法调整查询以适应。 目前有2种选择:
对于记录,“dapper”通过以下方式使原始命令(不是sprocs)变得容易:
int[] ids = ... var list = conn.Query( "select * from Foo where Id in @ids", new { ids } ).ToList();
它计算出如何将其转换为参数等。
以防万一有人在寻找SQL Server解决方案:
CREATE FUNCTION [dbo].[SplitString] ( @Input NVARCHAR(MAX), @Character CHAR(1) ) RETURNS @Output TABLE ( Item NVARCHAR(1000) ) AS BEGIN DECLARE @StartIndex INT, @EndIndex INT SET @StartIndex = 1 IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character BEGIN SET @Input = @Input + @Character END WHILE CHARINDEX(@Character, @Input) > 0 BEGIN SET @EndIndex = CHARINDEX(@Character, @Input) INSERT INTO @Output(Item) SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1) SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input)) END RETURN END
给出一个字符串数组,我将使用以下代码将其转换为逗号分隔的字符串列表
var result = string.Join(",", arr);
然后我可以按如下方式传递参数
Command.Parameters.AddWithValue("@Parameter", result);
在存储过程定义中,我将使用上面的参数,如下所示
上述就是C#学习教程:使用IN运算符和存储过程参数分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
select * from [dbo].[WhateverTable] where [WhateverColumn] in (dbo.splitString(@Parameter, ','))
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/985182.html