【问题标题】:What is the maximum length of a SqlCommand query?SqlCommand 查询的最大长度是多少?
【发布时间】:2016-04-01 09:52:49
【问题描述】:

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

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.TdsMetaParameterCollection 参数)
Mono.Data.Tds.Protocol.Tds70.ExecRPC (TdsRpcProcId rpcId, System.String sql, Mono.Data.Tds.TdsMetaParameterCollection 参数, Int32 超时, Boolean 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 () (at Assets/DataBaseConnection.cs:674)

我数了一下SqlCommand有多少个字符,是8125个字符(没有空格),10874个字符(有空格)。

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

我减少了参数的数量(直到 20 个参数),因此,命令长度和它的工作原理就像一个魅力(875 个字符没有空格,1,221 个字符有空格)。

总结一下,我的问题是:SQL Server 2014 中SqlCommand 查询的最大长度是多少?在 SQL Server 2008 中?

我的代码示例:

//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 中

【问题讨论】:

  • 我不认为这是parameter length 的问题。必须有一些parameter 这是一种数组,它会导致IndexOutOfRange Exception..没有更多细节,很难回答到底是什么导致了这个问题..
  • 如果你不得不问......它太长了:)
  • 不要只给我们一个长代码转储 - 确保您创建一个minimal reproducible example。强调最小。
  • 尝试使用较短的名称 :-) 100 x 3 x LEN(@LI_Input_Variable1_abcde) 非常多100 x LEN(@vXX) + 200 x LEN(@nXX) 少得多
  • 您的问题(堆栈跟踪)中只有一个小线索表明您使用的是 Mono,而不是 Microsoft 的 CLR。如果您在 mono sqlcommand index out of range 上进行搜索,您会发现很多提示暗示 Mono 的 SqlClient 类的实现可能存在连接池和/或线程问题。

标签: sql sql-server unity3d monodevelop executenonquery


【解决方案1】:

我来回答你问的问题:SqlCommand 查询的最大长度是多少?

语句的最大大小为 65536*Network Packet Size - 默认情况下约为 1500 字节。算一下 - 大约是 90MB。

超过这个,虽然不会导致你的错误。但这是你提出的问题。

【讨论】:

  • 大约 90 MB
【解决方案2】:

我一直试图通过减少更新变量的数量来找到限制,并且我发现了 SQL 命令长度的最佳位置

5,973 个字符(无空格) 7,967 个字符(带空格)

有 142 个参数

我认为在这种情况下 8,000 个字符可能是限制,但我不能 100% 保证。

我忘了说我正在使用集成在 Unity3D 中的 MonoDevelop 5.9.6。另一位用户 (Damien_The_Unbeliever) 告诉我这可能是 Mono 的 SqlClient 类实现的连接池和/或线程问题

【讨论】:

  • 您是否尝试使用较短的名称? 8000 非常接近 SQL Server VARCHAR(intValue) 的最大长度。不知道 Mono 的特点,但这里的字符串长度可能是个问题...您可以在 300 个位置保护约 20 个字符,应该值得一试...
  • 感谢您的建议!是的,我知道。问题是我不能缩短变量名。如果可以的话,我肯定会这样做,但他们必须保持原样。
  • @MetalxBeat 我现在也遇到了同样的情况。我想我可以通过不传递太多参数来解决;而是使用临时表来执行脚本的逻辑
猜你喜欢
  • 2011-12-01
  • 2010-10-23
  • 1970-01-01
  • 2011-10-24
  • 2010-11-20
  • 1970-01-01
  • 2015-11-24
  • 2011-09-22
  • 2016-07-13
相关资源
最近更新 更多