Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将逗号分隔的数字作为SQL参数传递_Vb.net_Ado.net - Fatal编程技术网

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在我的案例中没有用处。