Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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
C# 如何将字符串数组传递给存储过程?_C#_Sql Server - Fatal编程技术网

C# 如何将字符串数组传递给存储过程?

C# 如何将字符串数组传递给存储过程?,c#,sql-server,C#,Sql Server,我正在使用asp mvc,我想知道是否有可能将类似字符串的数组传递到存储过程中的操作中。我举了一个例子: C SQL: 它回来了 Conversion failed when converting the nvarchar value '123,234,234' to data type int. 我想通过is作为存储过程,但现在不知道从哪里开始 我尝试过的事情: 尝试使用替换功能,但仍然不起作用。 正如您所发现的,您不能这样做,因为包含由逗号分隔的数字字符序列的字符串与包含由逗号分隔的常量数

我正在使用asp mvc,我想知道是否有可能将类似字符串的数组传递到存储过程中的操作中。我举了一个例子:

C

SQL:

它回来了

Conversion failed when converting the nvarchar value '123,234,234' to data type int.
我想通过is作为存储过程,但现在不知道从哪里开始

我尝试过的事情:

尝试使用替换功能,但仍然不起作用。
正如您所发现的,您不能这样做,因为包含由逗号分隔的数字字符序列的字符串与包含由逗号分隔的常量数字的SQL程序不同。例如,您也不会期望此c工作:

int[] a =  new [] { 1,2,3 }; //works
int[] b =  "new [] { 1,2,3 }"; //doesn't work
你也不会期望这会起作用,而这正是你正在做的:

SELECT * FROM t WHERE x IN('1,2,3')
如果列是字符串,则不会出现错误,但也不会像预期的那样工作

SELECT * FROM t WHERE x IN ('a','b'). --works
SELECT * FROM t WHERE x IN ('''a'',''b'''). --valid, but doesn't select x that are "a" or "b"
总之,in就像一个函数,接受N个不同类型的参数。它不会看你传递的字符串,看到它有逗号并拆分它们

因此,您可以传递与项目数量相同的参数:

SELECT * FROM t WHERE x IN (@p1, @p2, @p3)
存储过程包含3个参数,每个参数放置一个值,如果只查找两个数字,则只需重复最后一个数字,因为IN1,2,2与IN1,2相同

或者创建一个类型:

CREATE TYPE dbo.IntList AS TABLE 
(
      X INT NOT NULL
)
您声明存储过程以获取该类型的变量

@numList x
var dt = new DataTable();
dt.Columns.Add("X", typeof(int));
在c中声明一个表示该类型的datatable

@numList x
var dt = new DataTable();
dt.Columns.Add("X", typeof(int));
每行填充一个int

您将参数声明为结构化

command.Parameters.AddWithValue("@numList", dt).SqlDbType = SqlDbType.Structured;

然后你执行它。请记住,您的@numList是一个类似于其他任何表的表,因此您不能在@numList中说SELECT*FROM t,其中x,您可以在t.x=n.x上选择*FROM t,JOIN@numList n,或者在t中选择*FROM,其中x FROM@numList等

int[]a=new[]{123234234}//工作

因为错误消息说您需要将temp设置为整数而不是varchar。请确保您使用的标记与您的特定问题相关。[vb.net]和[asp.net mvc]在这里没有相关性。@earvin是多语言标记,如果你说我也会接受vb.net中的答案,那就更容易接受了,因为我知道答案-一般来说,如果你在问题中只使用了一种语言,你应该只放一个标记对不起,我又用了一次对不起,错误的标记请注意,我们可以停止使用AddWithValue吗?这里不适用