2012-04-13 5 views
37

Der folgende Code implementiert einen UDT, die von einem generischen (SortedDictionary) ableitet:Warum werden von Generics abgeleitete CLR-Typen in SQL Server 2008 und höher nicht unterstützt?

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

Erstellen der Art (T-SQL):

:

CREATE TYPE dbo.udtMassSpectra EXTERNAL NAME MassSpectra.udtMassSpectra; 

eine Ausnahme auslöst Msg 10331, Ebene 16, Status 1, Zeile 1 Typ 'udtMassSpectra' in Assembly 'MassSpectra' stammt von einem generischen Typ ab, der für einenicht unterstützt wird 210 CLR-Typ.

Was ist der Grund? Gibt es eine andere Problemumgehung als das Ausblenden der Basisklasse in einem privaten Mitglied? Dieser Code funktioniert gut auf einem SQL-Server 2005.

+1

Ich hoffe, sie werden antworten. http://connect.microsoft.com/SQLServer/feedback/details/737635/cannot-create-udt-which-derives-from-a-generic-on-sql-server-2008 – lorond

+0

Ich denke, die Tatsache, dass es 2005 funktionierte und der Bericht wurde nicht auf Connect geschlossen, zeigt an, dass Sie über einen altmodischen Bug gestolpert sind. – Godeke

Antwort

0

Ich habe keine Erfahrung mit UDTs, aber möglicherweise ist das Problem, dass Float ist nicht in der Lage, SQL-Server NULL-Wert darzustellen.

habe ich einige der Forschung und fand dieses here

+0

'udtMassSpectra' implementiert' bool IsNull' von der Schnittstelle ['INullable'] (http://msdn.microsoft.com/en-us/library/system.data.sqltypes.inullable.aspx). Der Typ kann also den Null-Wert von SQL-Server darstellen. Vielleicht sollte ich klarstellen, dass dieser Code auf einem SQL Server 2005 einwandfrei funktioniert, aber auf späteren Versionen von SQL Server fehlschlägt. – jahu

0

Sie können durch das Speichern einer Instanz von SortedDictionary<float, float> in Ihrem UDT, um diese Einschränkung sehr einfach arbeiten.

Nur aus Neugier, ich würde gerne sehen, wie eine generische Klasse in einem T-SQL-Kontext instanziert wird, als Spaltendatentyp, Variable usw.

+1

Danke, aber ich erwähnte diese Problemumgehung bereits in meiner Frage. Verwenden Sie die Art wie diese, ziemlich Standard denke ich: 'TABLE #test CREATE ( \t [id] [unique] NOT NULL, \t [spectrum_freetext] [varchar] (max) NULL, \t [spectrum_binary] [dbo]. [udtMassSpectra] NULL, ) ON [PRIMARY] 'oder wie folgt wählen Sie udtMassSpectra :: Parse ('669.2344-745.5663 | 801.7557-880.7614 | 889.2369-978.5437 | 1016.6830-12 |'). ToString() als LCMS' – jahu

1

Ein weiterer Vorschlag:

Stellen Sie sicher, dass der Typ als eine Klasse definiert wurde, ist nicht primitiv, verschachtelt oder generische

PS:

Soweit "an MSSQL 2005, aber nicht an MSSQL 2008 gearbeitet" - ich zitiere Tom Petty: "Du hast Glück, Baby!" ;)