Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 UDT output в CLR процедуре = Exception.  [new]
mike909
Member

Откуда:
Сообщений: 662
Добрый день.

Обнаружил "особенность" работы SQL_я с UDT (определяемые пользователем типы данных CLR) переменной длины.
Если есть необходимость передачи UDT в CLR процедуру с последующим возвратом через output, то в случае, когда
в результате работы CLR-процедуры конечный размер UDT уменьшается - возникают различные Exception_ы.

+ Наиболее часто (у меня):
Msg 6522, Level 16, State 1, Line 7
A .NET Framework error occurred during execution of user-defined routine or aggregate "SP_BlaBlaBla":
System.IO.EndOfStreamException: Чтение после конца потока невозможно.
System.IO.EndOfStreamException:
в System.IO.BinaryReader.ReadString()
в SqlParams.Read(BinaryReader r)
в SqlParams::.Deserialize(IntPtr , Int32 , CClrLobContext* )


Вскрытие показало, что SQL не сбрасывает stream перед вызовом метода UDT public void Write(System.IO.BinaryWriter w).
Что приводит к заполнению переданного stream_а корректными данными + оставшийся мусор.

Решение:
  public void Write(System.IO.BinaryWriter w)
  {
    w.BaseStream.SetLength(0);
  }
28 янв 16, 10:11    [18739007]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить