C# UserDefinedTypeAttribute Frage.

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.075
Eine generelle Frage zu dem UDT (CLR in MS SQL). Wenn ich jetzt einen Typen in CLR schreibe, dann muss dieser Type immer ein ValueType sein (also ein struct)? ich habe schon mit Reference Type (class) versucht, aber scheint nur für structs ausgelegt zu sein.

Suche im Netze hat nicht wirklich was gebracht.

Ich schreibe gerade ein Tool, dass den Benutzer erlaubt den CLR Code "on the fly" neu zu importieren. Daher habe ich eine Abstrakte Klasse geschrieben, dass jeder CLR Type erbt. Wenn UDT aber nur Struct sein darf, dann muss ich das Konzept neu überdenken. Ich benutze für .NET 4 (also MS SQL 2012) oder höher System.ComponentModel.Composition.Export um schneller an die CLR Kompenenten ran zu kommen. Export erlaubt aber keine Structs. Ich kann auch keine Schachtelung benutzen (Nested Types). Diese werden auch nicht von MS SQL erkannt.


Danke
 
Klassen sind möglich, structs sind aber von der Performance her besser und sollten deshalb bevorzugt werden.
Außerdem sollten UDTs auch nicht zu komplex sein, sonst kann sich das ebenfalls negativ auf die Performance auswirken.

Genaueres siehe hier: User-Defined Type Requirements
 
Es ist offenbar ein MS SQL 2008R2 (und vielleicht von 2008) Problem. Ich habe gelesen, dass 2005er die Klassen als UDT erkennt. Ich habe selbst einen MS SQL 2012er dieser kann mit den Klassen auch umgehen.

Habe auch gelesen, dass UDT besser als Structs implementiert werden sollten, wegen der Perf. Dies ist aber marginal unterschiedlich, wenn man Native Format für UDT benutzt. Klar, Structs sind schneller, aber ich kann keine Structs als Export angeben. Hm muss mir vielleicht einen anderen Weg suchen.

Je mehr ich aber mit .NET beschäftige, desto mehr fällt mir auf, dass es an mehreren Stellen Bugs gibt. So kann man zum Beispiel keine Attributes einer Klasse heraus bekommen, wenn (SqlUserDefinedAggregate) MaxByteSize = -1 gesetzt wurde. Dieser Bug ist bekannt, seit 2010. DotNet4 und höher hat den Bug ausgebessert, aber was ist mit den anderen Versionen?

hier ist ein guter Artikel über UDT's

Na gut, offenbar ist es MS SQL Problem. Dann hat sich ja meine Frage erübrigt.
Danke.

EDIT
Ich habe einen Workaround geschrieben, der mir erlaubt mittels reflection auch die CLR zu erstellen. Ist keine sehr schöne Lösung aber es funktioniert.
Für jeden der Interesse hat, hier findet ihr den Code fürs Workaround.
 
Zuletzt bearbeitet:
Zurück
Oben