2012-04-13 6 views
37

Następujący kod realizuje UDT pochodzący z ogólnym (SortedDictionary):Dlaczego typy CLR pochodzą z generycznych nieobsługiwanych w SQL Server 2008 i nowszych wersjach?

[Serializable] 
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined, MaxByteSize = 8000)] 
public class udtMassSpectra : SortedDictionary<float, float>, INullable, IBinarySerialize, ICloneable, IDisposable 
{ 
... 
} 

Tworzenie typu (T-SQL)

CREATE TYPE dbo.udtMassSpectra EXTERNAL NAME MassSpectra.udtMassSpectra; 

wyjątek to

Msg 10331, poziom 16, Stan 1, wiersz 1 Typ "udtMassSpectra" w zestawie "MassSpectra" pochodzi od typu ogólnego, który nie jest obsługiwany w przypadku Typ CLR.

Jaki jest tego powód? Czy istnieje jakieś obejście poza ukrywaniem klasy bazowej w ramach prywatnego członka? Ten kod działa poprawnie na SQL-Server 2005.

+1

Mam nadzieję, że odpowiedzą. http://connect.microsoft.com/SQLServer/feedback/details/737635/cannot-create-udt-which-derives-from-a-eneric-on-sql-server-2008 – lorond

+0

Myślę, że to zadziałało w 2005 roku a raport nie został zamknięty w programie Connect, oznacza, że ​​możesz natknąć się na staroświecki błąd. – Godeke

Odpowiedz

0

Nie mam doświadczenia z UDTs, ale może problem polega na tym, że float nie jest w stanie reprezentować wartości NULL SQL Server.

Zrobiłem rozeznanie i znaleźć ten here

+0

'udtMassSpectra' implementuje' bool IsNull' z interfejsu ['Inullable'] (http://msdn.microsoft.com/en-us/library/system.data.sqltypes.inullable.aspx). Tak więc typ jest w stanie reprezentować wartość Null serwera SQL. Może powinienem wyjaśnić, że ten kod działa poprawnie na SQL Server 2005, ale nie działa w późniejszych wersjach serwera SQL. – jahu

0

bardzo prosty sposób można obejść to ograniczenie, przechowując wystąpienie SortedDictionary<float, float> w UDT.

Tak z ciekawości, chciałbym zobaczyć jak rodzajowy klasy jest tworzony w ramach T-SQL, jako typ danych kolumny, zmiennej itp

+1

Dzięki, ale wspomniałem o tym obejściu już w moim pytaniu. Użyj typu jak ten, dość standardowy myślę: 'CREATE TABLE # # # test ( \t [id] [uniqueidentifier] NOT NULL, \t [spectrum_freetext] [varchar] (max) NULL, \t [spectrum_binary] [dbo]. [udtMassSpectra] NULL, ) ON [PRIMARY] 'lub w ten sposób' wybierz udtMassSpectra :: Parse ('669.2344-745.5663 | 801.7557-880.7614 | 889.2369-978.5437 | 1016.6830-12 |'. ToString() jako LCMS'' – jahu

1

Jeszcze jedna sugestia:

czy typ zdefiniowano jako klasa nie jest prymitywny zagnieżdżone lub ogólny

PS

O ile "pracowałem na MSSQL 2005, ale nie MSSQL 2008" - cytuję Toma Petty: "Masz szczęście, kochanie!" ;)