Сериализация JSON и параметры .NET SQL - PullRequest
0 голосов
/ 15 февраля 2012

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

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

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

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

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

1 Ответ

0 голосов
/ 15 февраля 2012

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

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

...