Vb.net 将逗号分隔的数字作为SQL参数传递
我有一个使用绑定变量的查询。查询如下Vb.net 将逗号分隔的数字作为SQL参数传递,vb.net,ado.net,Vb.net,Ado.net,我有一个使用绑定变量的查询。查询如下 Select... From.... where Ids1 in (@SQLParameter1) and Ids2 in (@SQLParameter2) and Ids3 in (@SQLParameter3) 我有字符串格式的@SQLParameter1,@SQLParameter2,@SQLParameter3的值,所有数字以逗号分隔。我提到过SQLParameter数据类型是字符串,但Ids1、Ids2、Ids3是数字列,所以它会抛出错误。我尝
Select...
From....
where Ids1 in (@SQLParameter1)
and Ids2 in (@SQLParameter2)
and Ids3 in (@SQLParameter3)
我有字符串格式的@SQLParameter1
,@SQLParameter2
,@SQLParameter3
的值,所有数字以逗号分隔。我提到过SQLParameter数据类型是字符串,但Ids1、Ids2、Ids3是数字列,所以它会抛出错误。我尝试将数据类型作为Varnumeric,但它不起作用
那么,如何将逗号分隔的数字作为SQL参数传递
提前感谢。每个命令参数只能传递一个值。这样的值列表是不可能的 您必须动态地构造SQL
string sql = String.Format(
"SELECT * FROM tbl WHERE id1 IN ({0}) AND id2 IN ({1}) AND id3 IN ({2})",
id1List, id2List, id3List
);
但是要小心SQL注入。根据id列表的来源,您必须选择更复杂的方法并动态创建参数列表
string sql = String.Format(
"SELECT * FROM tbl WHERE id1 IN ({0}) AND id2 IN ({1}) AND id3 IN ({2})",
id1List, id2List, id3List
);
从tbl中选择*
哪里
ID1in(@1、@2、@3、@4)和
id2英寸(@5、@6、@7)和
id3英寸(@8,@9)
我不知道是否是这种情况,但如果三个ID构建一个主键,这种方法将不会选择唯一的主键组合。在这种情况下,查询必须如下所示
SELECT * FROM tbl
WHERE
(id1 = @1 AND id2 = @2 AND id3 = @3) OR
(id1 = @4 AND id2 = @5 AND id3 = @6) OR
(id1 = @7 AND id2 = @8 AND id3 = @9)
如果您使用的是SQL Server 2008,则可以为每个Id集合创建一个具有表值参数的存储过程。见下文:
CREATE TYPE SQLParameter1TableType AS TABLE
(
Id INT
);
GO
CREATE PROCEDURE dbo.TestStoredProcedure
(
@SQLParameter1 SQLParameter1TableType READONLY
)
AS
Select...
From....
where Ids1 in (@SQLParameter1)
GO
DECLARE @SQLParameter1 AS SQLParameter1TableType;
INSERT INTO @SQLParameter1 (Id)
...select from
EXEC dbo.TestStoredProcedure @SQLParameter1;
当然,如果您使用的是ADO.NET,那么这里有一篇有用的文章将向您展示如何将表值参数与.NET一起使用(您需要将语言转换为VB.NET):
以下是有关SQL Server表值参数的MSDN文章:
..或者,您可以将逗号分隔的字符串传递到SQL表值函数中,该函数拆分字符串并返回一个具有单列的表:
SELECT...
FROM....
where Ids1 in (SELECT * FROM dbo.SplitString(@SQLParameter1))
…或者您可以创建一个标量函数,该函数接受Id并检查它是否存在于提供的逗号分隔字符串中,并相应地返回true/false:
SELECT...
FROM.... AS T
WHERE dbo.ExistsInCommaSeperatedString(T.Id, @SQLParameter1) = 1
我使用动态SQL和一个快速正则表达式来处理这个问题,它可以抛出任何不是数字或逗号的东西。我认为这可以保护东西。是否存在只涉及数字和逗号的SQL注入攻击?我很想得到一个明确的答案。但我在vb.net中做了如下工作: intStr=“100110021003” Dim RegexObj As Regex=New Regex(“[^\d^\,]”) 如果RegexObj.IsMatch(intStr),则 intStr=“0” 如果结束 SQL=“从ID位于(“&intStr&”)的myTable中选择*”
等等解决方案-1。我可以动态构造查询,但使用绑定变量可以提高性能。解决方案2和3在我的案例中没有用处。