powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Ошибка при вызове хранимой процедуры с параметром типа xml
9 сообщений из 9, страница 1 из 1
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36557246
raptor@x-plat.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Имеется хранимая процедура с входящим параметром типа xml.

На стороне приложения .NET в данный параметр передаются валидный xml. Проблема состоит в том, что время от времени Sql Server 2008 возвращает ошибку парсинга данных из данного поля:
XML parsing: line 1, character 5461, '>' expected.

Лог программы показывает, что '>' на месте, просмотр значений при отладке программы - показывает, что в процедуру передается полностью валидный xml.

При перезапуске программы значение 5461 может измениться на любое другое. В процессе работы программы это значение не меняется.

Данная ошибка может возникать, а может и не возникать, т.е. один и тот же xml обрабатывается и корректно и вызывает ошибку.

Складывается впечатление, что данные, время от времени, просто не успевают дойти до сервера в процедуру.

Не поможете задать направление, в какую сторону копать!
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36557288
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сомнительно. Вероятней всего, что, всё-таки, xml не валидный.
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36557299
raptor@x-plat.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ,

100% валидный я же говорю 1 и тот же xml когда проходит, а когда с ошибкой выпадает.
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36557327
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст процедуры и текст клиентского кода в студию.
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36557473
raptor@x-plat.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все нашел где проблема... SqlCommand заполнялся параметрами, которые брались из кеша.

static private readonly Hashtable Cache = new Hashtable(100);
....
SqlCommandBuilder.DeriveParameters(command);
lock (Cache.SyncRoot)
{
Cache.Add(command.CommandText, command.Parameters);
}
После вызова DeriveParameters для поля типа xml свойство Size объекта Parameter устанавливается абсолютно произвольное. При вытягивании данных параметра из кеша, заполнялось и свойство Size для типа данных Xml. В итоге в на Sql server отправлялось лишь то количество байт из поля Value, которое было указано в свойстве Size.

Данное поведение несколько обескураживает т.к. в msdn есть два противоречивых описания по действию параметра Size:

The Size property is used for binary and string types. For parameters of type SqlType.String, Size means length in Unicode characters. For parameters of type SqlType.Xml, Size is ignored

For variable-length data types, Size describes the maximum amount of data to transmit to the server. For example, for a Unicode string value, Size could be used to limit the amount of data sent to the server to the first one hundred characters. - xml суть данные переменной длинны.


Возникает вопрос, откуда SqlCommandBuilder.DeriveParameters(...) берет значение свойства Size для типа данных Xml?!!!
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36557537
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SqlCommandBuilder.DeriveParameters тут ни при чём. Как только срабатывает сеттер SqlParameter.Value, он автоматически проставляет SqlParameter.Size.
В случае, если Вы присваиваете параметру в Value свой xml, он подберет нужный размер и всё будет хорошо. Но, если вручную определить ему размер после срабатывания сеттера Value, меньший чем длина xml, то будет ошибка.
Это доказывает то, что:

msdnFor parameters of type SqlType.Xml, Size is ignored

не выполняется.

Кстати, они допустили ошибку, не SqlType, а SqlDbType .
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36557560
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, чтобы исключить проблемы, предлагаю перед выполнением хранимой процедуры для типа xml сбросить размер:

Код: plaintext
command.Parameters["@Xml"].Size = 0;
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36558008
raptor@x-plat.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ,

я чуть по другому сделал :)
command.Parameters["@Xml"].Size = int.MaxValue;
...
Рейтинг: 0 / 0
Ошибка при вызове хранимой процедуры с параметром типа xml
    #36558018
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многабукаф, в моём варианте короче :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Ошибка при вызове хранимой процедуры с параметром типа xml
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]