2012-02-15 2 views
0

Я недавно присоединился к команде, где они используют сериализацию JSON для передачи массивов параметров в хранимые процедуры SQL Server, где они затем десериализуются и извлекаются необходимые значения. Каждая хранимая процедура имеет «@Parameters» 'параметра типа VARCHAR (MAX). Структура, создающая и выполняющая команду, написана на C# и использует стандартные типы .NET (SqlCommand, SQlParameter) и т. Д.Параметры JSON Serialization и .NET SQL

Похоже, что когда сериализованный контент больше по длине, чем пороговое значение, которое хранится в процедуре неправильно но никаких исключений не возникает. Кажется, ничего не происходит. Запуск SQL Profiler Я заметил, что нет попытки выполнить хранимую процедуру в SQL Server.

Например: В одном случае имеется только 30 экземпляров типа с не более чем восемью свойствами, которые сериализуются. Сериализация завершается успешно, и значение присваивается параметру sql в коллекции параметров SqlCommand (имеется только один параметр). Команда выполняется, но ничего не происходит. Если число экземпляров меньше, тогда это удается. Когда это не удается, исключение не возникает.

Использование: SQL Server 2008 C# .NET 4.0 JSON Сериализация, предоставляемая Newtonsoft. SqlParameter в коде создается как varchar max. Архитектура клиентского сервера - посреднических услуг нет.

Кто-нибудь знает, какой предел для сериализованных значений JSON передается как параметр sql с помощью SqlCommand или какие-либо идеи относительно того, что может вызывать такое поведение?

+0

Не могли бы вы указать значение параметра @Parameters? –

+0

Проблема связана с длиной содержимого, а не с самим содержимым, которое правильно сформировано. Я действительно интересовался, знает ли кто-нибудь о ограничениях размера при передаче сериализованных значений Json в качестве параметра sql. – Trev

ответ

0

Я выяснил, что происходит в моем случае. Это не имело никакого отношения к сериализации значения в sql-параметре, поскольку я обнаружил, что если бы я ждал достаточно долго (5-7 минут в моем случае), что процедура в конечном итоге была выполнена.

В хранимой процедуре используется курсор для извлечения интересующих записей (это процедура обновления партии). Этот курсор вызывал функцию CLR для десериализации Json для каждого требуемого значения. Вставив десриализованные данные в временную таблицу для использования в курсоре, проблема была решена.