Ответ 1
Еще одно предложение:
Убедитесь, что тип был определен как класс, не является примитивным, вложенным или общий
PS:
Насколько "работал на MSSQL 2005, но не MSSQL 2008", - цитирую Тома Петти: "Тебе повезло, детка!";)
Следующий код реализует UDT, который происходит из общего (SortedDictionary):
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined, MaxByteSize = 8000)]
public class udtMassSpectra : SortedDictionary<float, float>, INullable, IBinarySerialize, ICloneable, IDisposable
{
...
}
Создание типа (T-SQL):
CREATE TYPE dbo.udtMassSpectra EXTERNAL NAME MassSpectra.udtMassSpectra;
выдает исключение:
Msg 10331, уровень 16, состояние 1, строка 1 Тип 'udtMassSpectra' в сборке "MassSpectra" происходит от общего типа, который не поддерживается для Тип CLR.
В чем причина? Существует ли какое-либо обходное решение, кроме скрытия базового класса в частном члене? Этот код отлично работает на SQL Server 2005.
Еще одно предложение:
Убедитесь, что тип был определен как класс, не является примитивным, вложенным или общий
PS:
Насколько "работал на MSSQL 2005, но не MSSQL 2008", - цитирую Тома Петти: "Тебе повезло, детка!";)
У меня нет опыта работы с UDT, но, возможно, проблема в том, что float не может представлять значение NULL SQL-Server.
Я провел некоторое исследование и нашел здесь здесь
Вы можете просто обойти это ограничение, сохранив экземпляр SortedDictionary<float, float>
в своем UDT.
Просто из любопытства я хотел бы посмотреть, как генерируется общий класс в контексте T-SQL, как тип данных столбца, переменная и т.д.