39 votes

Pourquoi les types CLR dérivés de génériques ne sont pas pris en charge dans les versions 2008 et ultérieures de SQL Server ?

Le code suivant implémente une UDT qui dérive d'un générique (SortedDictionary) :

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

Création du type (T-SQL) :

CREATE TYPE dbo.udtMassSpectra EXTERNAL NAME MassSpectra.udtMassSpectra;

lance une exception :

Msg 10331, Level 16, State 1, Line 1 Type 'udtMassSpectra' in assembly MassSpectra' dérive d'un type générique qui n'est pas pris en charge pour un type CLR. Type CLR.

Quelle en est la raison ? Existe-t-il une solution de contournement autre que de cacher la classe de base dans un membre privé ? Ce code fonctionne bien sur un SQL-Server 2005.

1voto

Une autre suggestion :

Vérifiez que le type a été défini comme une classe, qu'il n'est pas primitif, emboîté ou générique

PS :

Pour ce qui est de "travailler sur MSSQL 2005 mais pas sur MSSQL 2008" - je cite Tom Petty : "Tu as de la chance, bébé !" ;)

0voto

Ludwig Wensauer Points 1052

Je n'ai pas d'expérience avec les UDTs, mais peut-être que le problème est que float n'est pas capable de représenter la valeur NULL de SQL-Server.

J'ai fait quelques recherches et j'ai trouvé ceci aquí

0voto

udog Points 722

Vous pouvez très simplement contourner cette limitation en stockant une instance de SortedDictionary<float, float> dans votre UDT.

Par curiosité, j'aimerais voir comment une classe générique est instanciée dans un contexte T-SQL, comme un type de données de colonne, une variable, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X