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

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

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

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

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

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

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

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

100% валидный я же говорю 1 и тот же xml когда проходит, а когда с ошибкой выпадает.
...
Рейтинг: 0 / 0
02.04.2010, 11:45
    #36557327
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при вызове хранимой процедуры с параметром типа xml
Текст процедуры и текст клиентского кода в студию.
...
Рейтинг: 0 / 0
02.04.2010, 12:31
    #36557473
raptor@x-plat.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при вызове хранимой процедуры с параметром типа xml
Все нашел где проблема... 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
02.04.2010, 12:51
    #36557537
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при вызове хранимой процедуры с параметром типа xml
SqlCommandBuilder.DeriveParameters тут ни при чём. Как только срабатывает сеттер SqlParameter.Value, он автоматически проставляет SqlParameter.Size.
В случае, если Вы присваиваете параметру в Value свой xml, он подберет нужный размер и всё будет хорошо. Но, если вручную определить ему размер после срабатывания сеттера Value, меньший чем длина xml, то будет ошибка.
Это доказывает то, что:

msdnFor parameters of type SqlType.Xml, Size is ignored

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

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

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

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


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