Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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
SqlCommand查询的最大长度是多少?_Sql_Sql Server_Unity3d_Monodevelop_Executenonquery - Fatal编程技术网

SqlCommand查询的最大长度是多少?

SqlCommand查询的最大长度是多少?,sql,sql-server,unity3d,monodevelop,executenonquery,Sql,Sql Server,Unity3d,Monodevelop,Executenonquery,我目前正在使用SQL Server 2014中的C#脚本更新和读取值。使用SQlCommand执行ExecuteOnQuery时,在运行脚本时会弹出一个错误: IndexOutOfRangeException:数组索引超出范围。 Mono.Data.Tds.Protocol.TdsComm.AppendInternal(Int16 s) Mono.Data.Tds.Protocol.TdsComm.Append(System.String s) Mono.Data.Tds.Protocol.Td

我目前正在使用SQL Server 2014中的C#脚本更新和读取值。使用SQlCommand执行ExecuteOnQuery时,在运行脚本时会弹出一个错误:

IndexOutOfRangeException:数组索引超出范围。
Mono.Data.Tds.Protocol.TdsComm.AppendInternal(Int16 s)
Mono.Data.Tds.Protocol.TdsComm.Append(System.String s)
Mono.Data.Tds.Protocol.Tds70.WriteRpcParameterInfo(Mono.Data.Tds.tdsmetapParameterCollection参数)
Mono.Data.Tds.Protocol.Tds70.ExecRPC(TdsRpcProcId rpcId,System.String sql,Mono.Data.Tds.TdsMetaParameterCollection参数,Int32超时,布尔wantResults)
Mono.Data.Tds.Protocol.Tds70.Execute(System.String commandText、Mono.Data.Tds.TdsMetaParameterCollection参数、Int32超时、布尔wantResults)
System.Data.SqlClient.SqlCommand.Execute(布尔wantResults)
System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
(带检查的包装器远程调用)
System.Data.SqlClient.SqlCommand:ExecuteNonQuery()
Database.DataBaseConnection.Update()(位于Assets/DataBaseConnection.cs:674)

我计算了
SqlCommand
有多少个字符,它是8125个字符(没有空格),10874个字符(有空格)

有198个参数,但我想这不是因为这个,因为我在某个地方读到,单个查询的最大参数量是2000个,对吗

我减少了参数的数量(直到20个参数),因此,命令长度和它的工作方式就像一个符咒(875个字符没有空格,1221个字符有空格)

总之,我的问题是:SQL Server 2014中
SqlCommand
查询的最大长度是多少?那么在SQLServer2008中呢

我的代码示例:

//New command to update values in input table in sql server
using (SqlCommand command = new SqlCommand("UPDATE DigitalInputs" +
    " SET Value = CASE Name" +
    " WHEN @LI_Input_Variable1_Name THEN @LI_Input_Variable1_Value" +
    " WHEN @LI_Input_Variable2_Name THEN @LI_Input_Variable2_Value" +
    " WHEN @LI_Input_Variable3_Name THEN @LI_Input_Variable3_Value" +
    //It is the same from 3 till 99
    " WHEN @LI_Input_Variable99_Name THEN @LI_Input_Variable99_Value" +
    " END" +
    " WHERE Name IN (@LI_Input_Variable1_Name, @LI_Input_Variable2_Name, @LI_Input_Variable3_Name,
    //It is the same from 3 till 99
    @LI_Input_Variable99_Name);", connection))
{

command.Parameters.Add(new SqlParameter("LI_Input_Variable1_Name", "LI_Input_Variable1"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable1_Value", LI_Input_Variable1.ToString()));
command.Parameters.Add(new SqlParameter("LI_Input_Variable2_Name", "LI_Input_Variable2"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable2_Value", LI_Input_Variable2.ToString()));
command.Parameters.Add(new SqlParameter("LI_Input_Variable3_Name", "LI_Input_Variable3"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable3_Value", LI_Input_Variable3.ToString()));
//It is the same from 3 till 99
command.Parameters.Add(new SqlParameter("LI_Input_Variable99_Name", "LI_Input_Variable99"));
command.Parameters.Add(new SqlParameter("LI_Input_Variable99_Value", LI_Input_Variable99.ToString()));

command.ExecuteNonQuery(); //Execute the non query
}
后期编辑:
我正在用MonoDevelop 5.9.6实现这个脚本。在Unity3D中,让我回答您提出的问题:SqlCommand查询的最大长度是多少

语句的最大大小为65536*网络数据包大小-默认情况下约为1500字节。计算一下——大约是90MB


但是,超过此值不会导致您的错误。但这正是您提出的问题。

我一直试图通过减少更新变量的数量来找到限制,并且在SQL命令的长度中找到了一个最佳点

5973个字符(无空格) 7967个字符(带空格)

有142个参数

我想在这种情况下8000个字符可能是限制,但我不能100%保证


我忘了说我使用的是集成在Unity3D中的MonoDevelop 5.9.6。另一位用户(Damien_The_Unsiever)给了我线索,这可能是Mono实现SqlClient类时出现的连接池和/或线程问题,我认为这不是参数长度问题。必须有一些
参数
,它是数组的一种,并导致
索引自动失效异常
。。如果没有更多的细节,很难回答到底是什么导致了这个问题…如果你不得不问…它太长了:)不要只是给我们一个长的代码转储-确保你创建了一个。尽量使用较短的名称:-)
100x3xlen(@LI\u Input\u Variable1\u abcde)
非常重要,
100xlen(@vXX)+200xlen(@nXX)
要少得多在你的问题中只有一个小线索(堆栈跟踪)表明你使用的是Mono,而不是微软的CLR。如果您在
mono sqlcommand index out range
上搜索,您会发现相当多的点击提示mono实现的
SqlClient
类可能存在连接池和/或线程问题。您是否尝试使用较短的名称?8000非常接近SQL Server VARCHAR的最大长度(intValue)。我不知道Mono的特殊性,但字符串长度可能是这里的一个问题。。。你可以在300个地方保护20个字符,值得一试…谢谢你的建议!是的,我知道。问题是我不能缩短变量名。如果我可以,我肯定会这么做,但他们必须保持原样。@MetalxBeat现在我也遇到了同样的情况。我想我可以通过不传递太多参数来修复;而是使用一个临时表,用于脚本的逻辑,它大约是90MB