В настоящее время я обновляю и читаю значения с помощью сценария C # из SQL Server 2014. При использовании SQlCommand для выполненияNonQuery выдает ошибку при запуске сценария:
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 sqlds, Mono.Data. Параметры 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
, и это 8 125 символов (без пробелов), 10 874 символа (с пробелами).
Есть 198 параметров, но я думаю, что это не из-за этого, потому что где-то я читал, что максимальное количество параметров для одного запроса было 2000, я прав?
Я уменьшил количество параметров (до 20 параметров) и, соответственно, длину команды, и это работает как шарм (875 символов без пробелов и 1221 символ с пробелами).
Подводя итог, мой вопрос: какова максимальная длина SqlCommand
запроса в SQL Server 2014? А в 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
.. Без дополнительных подробностей трудно ответить, что на самом деле вызывает проблему .. - person Guruprasad J Rao   schedule 01.04.2016100 x 3 x LEN(@LI_Input_Variable1_abcde)
очень много,100 x LEN(@vXX) + 200 x LEN(@nXX)
намного меньше - person Shnugo   schedule 01.04.2016mono sqlcommand index out of range
, вы найдете довольно много совпадений, которые намекают на возможные проблемы с пулом соединений и / или потоками с реализацией классовSqlClient
в Mono. - person Damien_The_Unbeliever   schedule 01.04.2016