Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 2099参数处的SqlCommand最大参数异常_C#_Sql Server 2008_Ado.net - Fatal编程技术网

C# 2099参数处的SqlCommand最大参数异常

C# 2099参数处的SqlCommand最大参数异常,c#,sql-server-2008,ado.net,C#,Sql Server 2008,Ado.net,我在一个SqlCommand中批处理不同的查询,当我达到2100参数限制时停止查询批处理。如果我的批处理有2100或2099个参数,我仍然会得到异常 即使参数数小于2100,以下测试代码也会引发“参数过多异常” var parametersMax = 2099; var connection = new SqlConnection(@"Data Source=.;Integrated Security=SSPI;"); connection.Open(); var enumerable =

我在一个SqlCommand中批处理不同的查询,当我达到2100参数限制时停止查询批处理。如果我的批处理有2100或2099个参数,我仍然会得到异常

即使参数数小于2100,以下测试代码也会引发“参数过多异常”

var parametersMax = 2099;

var connection = new SqlConnection(@"Data Source=.;Integrated Security=SSPI;");
connection.Open();

var enumerable = Enumerable.Range(0, parametersMax);

var query = string.Format("SELECT {0}", String.Join(", ", enumerable.Select(s => string.Format("P{0} = @p{0}",s))));

var command = new SqlCommand(query, connection);

foreach(var i in enumerable)
    command.Parameters.Add(string.Format("p{0}",i), i);

// here: command.Parameters.Count is 2099

var reader = command.ExecuteReader(); // throws: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.
考虑到异常消息和这里的文档:我希望在一个查询中能够有2100个参数,但这似乎不是真的。有人知道为什么吗?我错过什么了吗


(我正在使用Sql Server 2008 R2)

发送到Sql Server的命令是

exec sp_executesql 
          N'SELECT P0 = @p0, P1 = @p1, P2 = @p2...',
          N'@p0 int,@p1 int,@p2 int...',
          @p0=0,@p1=1,@p2=2...

请注意,
sp_executesql
调用中的两个参数槽被查询文本的
NVARCHAR
字符串占用,因此参数定义“仅”留下2098供您使用。

您使用这么多参数的目的是什么?您考虑过使用表值参数吗?它是否适用于2098/2097/等。我认为SQL默认情况下有一个ReturnValue参数。我无法按设计使用它,我可以将查询拆分为多个批次。我只是想知道为什么我不能像上面说的那样使用2100个参数。0到2099的
可枚举范围
不会创建2100个参数吗?如果范围为1到2099,它是否有效?@ipr101 Enumerable.range(0,2099)从0()开始创建2099个元素的枚举。我在这个错误前面(这个EXECUTE语句中有太多参数。最大数量是2100)。意识到问题在于sp_executesql参数计数。非常感谢!:)+对于这个答案,我的答案是1。我也有同样的事情发生在我身上。VS报告的command.Parameters.Count正好是2100,SQL Server表明我有超过2100个参数。我三年级的教育告诉我有些不对劲。通过一些实验,我发现2098是真正的最大参数数。因此,从ADO.NET的角度来看,至少可以说错误消息具有误导性。我将最大值设置为2090,以防Microsoft更改其ADO.NET实现。