SQL CLR-Typzuordnung (LINQ to SQL)
Aktualisiert: November 2007
In LINQ to SQL wird das Datenmodell einer relationalen Datenbank einem Objektmodell zugeordnet, das in einer beliebigen Programmiersprache erstellt wurde. Bei der Ausführung der Anwendung wandelt LINQ to SQL die sprachintegrierten Abfragen im Objektmodell in SQL um und sendet sie zur Ausführung an die Datenbank. Wenn die Datenbank die Ergebnisse zurückgibt, übersetzt LINQ to SQL diese zurück in Objekte, mit denen in einer Programmiersprache gearbeitet werden kann.
Damit Daten zwischen Objektmodell und Datenbank übertragen werden können, muss ein Typmapping definiert werden. Mithilfe des Typmappings stellt LINQ to SQL eine Zuordnung zwischen jedem Typ der CLR (Common Language Runtime) und einem bestimmten SQL Server-Typ her. Die Typmappings und andere Mappinginformationen, wie Datenbankstrukturen und Tabellenbeziehungen, können im Objektmodell mithilfe von attributbasiertem Mapping definiert werden. Alternativ dazu können die Mappinginformationen außerhalb des Objektmodells mit einer externen Mappingdatei festgelegt werden. Weitere Informationen finden Sie unter Attributbasierte Zuordnung (LINQ to SQL) und Referenz zur externen Zuordnung (LINQ to SQL).
In diesem Thema werden folgende Punkte erläutert:
Standardtypmapping
Übersicht des Laufzeitverhaltens von Typzuordnungen
Verhaltensunterschiede zwischen CLR- und SQL-Ausführung
Enumerationszuordnung
Numerisches Mapping
Text- und XML-Mapping
Datums- und Uhrzeitmapping
Binäres Mapping
Verschiedene Mappingtypen
Standardtypmapping
Das Objektmodell oder die externe Mappingdatei kann mithilfe des objektrelationalen Designers (O/R-Designer) oder mit dem Befehlszeilentool SQLMetal automatisch erstellt werden. Durch Standardtypmappings für diese Tools wird festgelegt, welche CLR-Typen bestimmten Spalten in der SQL Server-Datenbank zugeordnet werden sollen. Weitere Informationen zum Verwenden dieser Tools finden Sie unter Erstellen des Objektmodells (LINQ to SQL).
Mithilfe der CreateDatabase-Methode kann weiterhin eine SQL Server-Datenbank auf Grundlage der Mappinginformationen des Objektmodells oder der externen Mappingdatei erstellt werden. Mit den Standardtypmappings für die CreateDatabase-Methode wird festgelegt, welche Typen von SQL Server-Spalten für das Mapping der CLR-Typen im Objektmodell erstellt werden. Weitere Informationen finden Sie unter Gewusst wie: Dynamisches Erstellen einer Datenbank (LINQ to SQL).
Übersicht des Laufzeitverhaltens von Typmappings
In der folgenden Grafik wird das erwartete Laufzeitverhalten spezifischer Typmappings dargestellt, wenn Daten von der Datenbank abgerufen oder in ihr gespeichert werden. Mit Ausnahme der Serialisierung unterstützt LINQ to SQL kein Mapping zwischen CLR- oder SQL Server-Datentypen, die nicht in dieser Matrix aufgeführt sind. Weitere Informationen zur Unterstützung der Serialisierung finden Sie unter Binäre Serialisierung.
Hinweis: |
---|
Einige Typmappings können bei der Übertragung in die Datenbank oder aus der Datenbank einen Überlauf oder Datenverlust verursachen. |
Benutzerdefinierte Typmappings
Mit LINQ to SQL sind die Standardtypmappings nicht auf diejenigen beschränkt, die von O/R-Designer, SQLMetal und der CreateDatabase-Methode verwendet werden. Sie können benutzerdefinierte Typmappings erstellen, indem Sie sie explizit in einer DBML-Datei angeben. Anschließend können Sie diese DBML-Datei verwenden, um den Objektmodellcode und die Mappingdatei zu erstellen. Weitere Informationen finden Sie unter Benutzerdefinierte SQL-CLR-Typmappings (LINQ to SQL).
Verhaltensunterschiede zwischen CLR- und SQL-Ausführung
Aufgrund der Unterschiede bezüglich Präzision und Ausführung zwischen der CLR und SQL Server können Berechnungen zu unterschiedlichen Ergebnissen und unterschiedlichem Verhalten führen. Berechnungen, die in LINQ to SQL-Abfragen ausgeführt wurden, werden erst in Transact-SQL übersetzt und dann für die SQL Server-Datenbank ausgeführt. Außerhalb von LINQ to SQL-Abfragen ausgeführte Berechnungen werden im Kontext der CLR ausgeführt.
Im Folgenden werden Beispiele für Verhaltensunterschiede zwischen der CLR und SQL Server aufgeführt:
In SQL Server und der CLR werden verschiedene vergleichbare Datentypen unterschiedlich sortiert. Zum Beispiel werden SQL Server-Daten des Typs UNIQUEIDENTIFIER anders sortiert als CLR-Daten des Typs System.Guid.
SQL Server behandelt verschiedene Vorgänge für Zeichenfolgenvergleiche anders als die CLR. In SQL Server ist das Verhalten bei Zeichenfolgenvergleichen von den Sortierungseinstellungen auf dem Server abhängig. Weitere Informationen finden Sie unter Arbeiten mit Sortierungen in der Microsoft SQL Server-Onlinedokumentation.
Für einige zugeordnete Funktionen werden von SQL Server andere Werte zurückgegeben als von der CLR. Die Funktionen für die Überprüfung auf Gleichheit beispielsweise unterscheiden sich, da von SQL Server zwei Zeichenketten als gleich aufgefasst werden, wenn sie sich lediglich durch nachgestellte Leerzeichen unterscheiden, während solche Zeichenketten von der CLR als unterschiedlich aufgefasst werden.
Enumerationsmapping
LINQ to SQL unterstützt für das Mapping des CLR-System.Enum-Typs zu SQL Server-Typen zwei Arten:
Zuordnung zu numerischen SQL-Typen (TINYINT, SMALLINT, INT, BIGINT)
Wenn ein CLR-System.Enum-Typ einem numerischen SQL-Typ zugeordnet wird, wird der zugrunde liegende CLR-System.Enum-Typ dem Wert der SQL Server-Datenbankspalte zugeordnet. Enthält z. B. ein Enum mit dem Namen DaysOfWeek einen Member mit dem Namen Tue und dem zugrunde liegenden Ganzzahlwert 3, wird dieser dem Datenbankwert 3 zugeordnet.
Zuordnung zu SQL-Texttypen (CHAR, NCHAR, VARCHAR, NVARCHAR)
Wenn ein CLR-System.Enum-Typ einem SQL-Texttyp zugeordnet wird, wird der SQL-Datenbankwert den Namen der CLR-System.Enum-Member zugeordnet. Enthält z. B. ein Enum mit dem Namen DaysOfWeek einen Member mit dem Namen Tue und dem zugrunde liegenden Ganzzahlwert 3, wird dieser dem Datenbankwert Tue zugeordnet.
Hinweis: |
---|
Beim Mapping von SQL-Texttypen zu einer CLR-System.Enum sollten nur die Namen der Enum-Member in der zugeordneten SQL-Spalte enthalten sein. Andere Werte werden in der der Enum zugeordneten SQL-Spalte nicht unterstützt. |
Der O/R-Designer und das SQLMetal-Befehlszeilentool können einen SQL-Typ nicht automatisch einer CLR-Enum-Klasse zuordnen. Sie müssen dieses Mapping explizit konfigurieren, indem Sie eine DBML-Datei anpassen, die vom O/R-Designer und SQLMetal verwendet werden kann. Weitere Informationen über benutzerdefinierte Typmappings finden Sie unter Benutzerdefinierte SQL-CLR-Typmappings (LINQ to SQL).
Da eine für die Enumeration vorgesehene SQL-Spalte vom gleichen Typ ist wie andere numerische Spalten und Textspalten kann von diesen Tools nicht festgestellt werden, wofür die Spalte verwendet werden soll. Die Spalte wird standardmäßig zugeordnet, wie in den folgenden Abschnitten Numerisches Mapping und Text- and XML-Mapping beschrieben. Weitere Informationen über das Generieren von Code mit der DBML-Datei finden Sie unter Codegenerierung in LINQ to SQL.
Die DataContext.CreateDatabase-Methode erstellt eine SQL-Spalte des numerischen Typs, um einen CLR-System.Enum-Typ zuzuordnen.
Numerisches Mapping
Mit LINQ to SQL können viele numerische CLR- und SQL Server-Typen zugeordnet werden. In der folgenden Tabelle sind die CLR-Typen aufgeführt, die von O/R-Designer und SQLMetal für die auf einer bestehenden Datenbank basierende Erstellung eines Objektmodells oder einer externen Mappingdatei ausgewählt werden.
SQL Server-Typ |
Von O/R-Designer und SQLMetal verwendetes CLR-Standardtypmapping |
---|---|
BIT |
|
TINYINT |
|
INT |
|
BIGINT |
|
SMALLMONEY |
|
MONEY |
|
DECIMAL |
|
NUMERIC |
|
REAL/FLOAT(24) |
|
FLOAT/FLOAT(53) |
In der nächsten Tabelle werden die Standardtypmappings angezeigt, die von der DataContext.CreateDatabase-Methode verwendet werden, um festzulegen, welche Typen von SQL-Spalten für die Zuordnung zu den im Objektmodell oder der externen Mappingdatei definierten CLR-Typen erstellt werden.
CLR-Typ |
Von DataContext.CreateDatabase verwendeter SQL Server-Standardtyp |
---|---|
BIT |
|
TINYINT |
|
SMALLINT |
|
INT |
|
BIGINT |
|
SMALLINT |
|
INT |
|
BIGINT |
|
DECIMAL(20) |
|
DECIMAL(29,4) |
|
REAL |
|
FLOAT |
Es können viele andere numerische Mappings ausgewählt werden. Einige davon können jedoch bei der Übertragung in die Datenbank oder aus der Datenbank einen Überlauf oder Datenverlust verursachen. Weitere Informationen finden Sie unter Laufzeitverhaltens-Matrix des Typmappings.
Dezimal- und Währungstypen
Die Standardgenauigkeit des SQL Server-Typs DECIMAL (18 Dezimalstellen links und rechts des Dezimalpunkts) ist wesentlich geringer als die Genauigkeit des CLR-Typs Decimal, dem dieser SQL Server-Typ standardmäßig zugeordnet wird. Dies kann beim Speichern von Daten in der Datenbank zu Genauigkeitsverlust führen. Umgekehrt kann jedoch das gleiche auftreten, wenn der SQL Server-Typ DECIMAL für eine Genauigkeit von mehr als 29 Stellen konfiguriert ist. Wenn der SQL Server-Typ DECIMAL für eine höhere Genauigkeit konfiguriert ist als der CLR-Typ System.Decimal, kann Genauigkeitsverlust beim Abrufen von Daten aus der Datenbank auftreten.
Die SQL Server-Typen MONEY und SMALLMONEY, die standardmäßig ebenfalls dem CLR-Typ System.Decimal zugeordnet werden, haben eine niedrigere Genauigkeit. Dies kann beim Speichern von Daten in der Datenbank einen Überlauf oder Datenverlust verursachen.
Text- und XML-Mapping
Es gibt viele textbasierte Typen und XML-Typen, die mit LINQ to SQL zugeordnet werden können. In der folgenden Tabelle sind die CLR-Typen aufgeführt, die von O/R-Designer und SQLMetal für die auf einer bestehenden Datenbank basierende Erstellung eines Objektmodells oder einer externen Mappingdatei ausgewählt werden.
SQL Server-Typ |
Von O/R-Designer und SQLMetal verwendetes CLR-Standardtypmapping |
---|---|
CHAR |
|
NCHAR |
|
VARCHAR |
|
NVARCHAR |
|
TEXT |
|
NTEXT |
|
XML |
In der nächsten Tabelle werden die Standardtypmappings angezeigt, die von der DataContext.CreateDatabase-Methode verwendet werden, um festzulegen, welche Typen von SQL-Spalten für die Zuordnung zu den im Objektmodell oder der externen Mappingdatei definierten CLR-Typen erstellt werden.
CLR-Typ |
Von DataContext.CreateDatabase verwendeter SQL Server-Standardtyp |
---|---|
NCHAR(1) |
|
NVARCHAR(4000) |
|
NVARCHAR(4000) |
|
Benutzerdefinierter Typ, mit dem Parse() und ToString() implementiert werden. |
NVARCHAR(MAX) |
Es können viele andere textbasierte und XML-Mappings ausgewählt werden. Einige davon können jedoch bei der Übertragung in die Datenbank oder aus der Datenbank einen Überlauf oder Datenverlust verursachen. Weitere Informationen finden Sie unter Laufzeitverhaltens-Matrix des Typmappings.
XML-Typen
Der XML-Datentyp von SQL Server ist seit Microsoft SQL Server 2005 verfügbar. Der XML-Datentyp von SQL Server kann XElement, XDocument oder String zugeordnet werden. Wenn die Spalte XML-Fragmente speichert, die nicht in XElement eingelesen werden können, muss die Spalte String zugeordnet werden, um Laufzeitfehler zu vermeiden. Zu den XML-Fragmenten, die String zugeordnet werden müssen, zählen die folgenden:
Eine Sequenz von XML-Elementen
Attribute
Öffentliche Bezeichner (Public Identifier, PI)
Kommentare
Obwohl XElement und XDocument, wie in der Laufzeitverhaltens-Matrix des Typmappings dargestellt, SQL Server zugeordnet werden kann, verfügt die DataContext.CreateDatabase-Methode nicht über ein SQL Server-Standardtypmapping für diese Typen.
Benutzerdefinierte Typen
Wenn eine Klasse Parse() und ToString() implementiert, können deren Objekte einem beliebigen SQL-Texttyp (CHAR, NCHAR, VARCHAR, NVARCHAR, TEXT, NTEXT, XML) zugeordnet werden. Das Objekt wird in der Datenbank gespeichert, indem der von ToString() zurückgegebene Wert an die zugeordnete Datenbankspalte gesendet wird. Das Objekt wird rekonstruiert, indem Parse() für die von der Datenbank zurückgegebene Zeichenfolge aufgerufen wird.
Hinweis: |
---|
LINQ to SQL unterstützt keine Serialisierung mithilfe von IXmlSerializable. |
Datums- und Uhrzeitmapping
Mit LINQ to SQL können viele SQL Server-Datums- und Uhrzeittypen zugeordnet werden. In der folgenden Tabelle sind die CLR-Typen aufgeführt, die von O/R-Designer und SQLMetal für die auf einer bestehenden Datenbank basierende Erstellung eines Objektmodells oder einer externen Mappingdatei ausgewählt werden.
SQL Server-Typ |
Von O/R-Designer und SQLMetal verwendetes CLR-Standardtypmapping |
---|---|
SMALLDATETIME |
|
DATETIME |
|
DATETIME2 |
|
DATETIMEOFFSET |
|
DATE |
|
TIME |
In der nächsten Tabelle werden die Standardtypmappings angezeigt, die von der DataContext.CreateDatabase-Methode verwendet werden, um festzulegen, welche Typen von SQL-Spalten für die Zuordnung zu den im Objektmodell oder der externen Mappingdatei definierten CLR-Typen erstellt werden.
CLR-Typ |
Von DataContext.CreateDatabase verwendeter SQL Server-Standardtyp |
---|---|
DATETIME |
|
DATETIMEOFFSET |
|
TIME |
Es können viele andere Datums- und Uhrzeitmappings ausgewählt werden. Einige davon können jedoch bei der Übertragung in die Datenbank oder aus der Datenbank einen Überlauf oder Datenverlust verursachen. Weitere Informationen finden Sie unter Laufzeitverhaltens-Matrix des Typmappings.
Hinweis: |
---|
Die SQL Server-Typen DATETIME2, DATETIMEOFFSET, DATE und TIME sind seit Microsoft SQL Server 2008 verfügbar. LINQ to SQL unterstützt das Mapping dieser neuen Typen seit .NET Framework, Version 3.5, SP1. |
System.DateTime
Der Bereich und die Genauigkeit des CLR-Typs System.DateTime sind größer als der Bereich und die Genauigkeit des SQL Server-Typs DATETIME. Diese beiden Typen werden mit dem Standardtypmapping der DataContext.CreateDatabase-Methode einander zugeordnet. Um Ausnahmen im Zusammenhang mit außerhalb des Bereichs von DATETIME liegenden Datumswerten zu vermeiden, sollte der seit Microsoft SQL Server 2008 verfügbare DATETIME2-Typ verwendet werden. DATETIME2 kann den Bereich und die Genauigkeit des CLR-Typs System.DateTime aufnehmen.
SQL Server-Datumswerte unterstützen keine TimeZone, ein Feature, das in der CLR große Bedeutung hat. TimeZone-Werte werden ohne TimeZone-Umwandlung in der Datenbank gespeichert, unabhängig von den ursprünglichen DateTimeKind-Informationen. Werden DateTime-Werte aus der Datenbank abgerufen, werden diese wie in DateTime mit einer DateTimeKind von Unspecified geladen. Weitere Informationen über unterstützte System.DateTime-Methoden finden Sie unter System.DateTime-Methoden (LINQ to SQL).
System.TimeSpan
Mit Microsoft SQL Server 2008 und .NET Framework 3.5 SP1 kann der CLR-Typ System.TimeSpan dem SQL Server-Typ TIME zugeordnet werden. Es gibt jedoch große Unterschiede im von dem CLR-Typ System.TimeSpan und dem SQL Server-Typ TIME unterstützten Bereich. Das Mapping von Stundenwerten kleiner als 0 oder größer als 23:59:59.9999999 zum SQL-Typ TIME hat Überlaufausnahmen zur Folge. Weitere Informationen finden Sie unter System.TimeSpan-Methoden (LINQ to SQL).
In Microsoft SQL Server 2000 und SQL Server 2005 können TimeSpan keine Datenbankfelder zugeordnet werden. Dennoch werden Operationen für TimeSpan unterstützt, da TimeSpan-Werte von DateTime-Subtraktionen zurückgegeben oder als Literal oder gebundene Variable in einen Ausdruck integriert werden können.
Binäres Mapping
Es gibt mehrere SQL Server-Typen, die dem CLR-Typ System.Data.Linq.Binary zugeordnet werden können. In der folgenden Tabelle sind die SQL Server-Typen aufgeführt, für die von O/R-Designer und SQLMetal für die auf einer bestehenden Datenbank basierende Erstellung eines Objektmodells oder einer externen Mappingdatei der CLR-Typ System.Data.Linq.Binary definiert wird.
SQL Server-Typ |
Von O/R-Designer und SQLMetal verwendetes CLR-Standardtypmapping |
---|---|
BINARY(50) |
|
VARBINARY(50) |
|
VARBINARY(MAX) |
|
VARBINARY(MAX) mit dem Attribut FILESTREAM |
|
IMAGE |
|
TIMESTAMP |
In der nächsten Tabelle werden die Standardtypmappings angezeigt, die von der DataContext.CreateDatabase-Methode verwendet werden, um festzulegen, welche Typen von SQL-Spalten für die Zuordnung zu den im Objektmodell oder der externen Mappingdatei definierten CLR-Typen erstellt werden.
CLR-Typ |
Von DataContext.CreateDatabase verwendeter SQL Server-Standardtyp |
---|---|
VARBINARY(MAX) |
|
VARBINARY(MAX) |
|
VARBINARY(MAX) |
Es können viele andere binäre Mappings ausgewählt werden. Einige davon können jedoch bei der Übertragung in die Datenbank oder aus der Datenbank einen Überlauf oder Datenverlust verursachen. Weitere Informationen finden Sie unter Laufzeitverhaltens-Matrix des Typmappings.
SQL Server FILESTREAM
Das FILESTREAM-Attribut für VARBINARY(MAX)-Spalten ist seit Microsoft SQL Server 2008 verfügbar. Dieses Attribut kann ab .NET Framework Version 3.5 SP1 mit LINQ to SQL zugeordnet werden.
Obwohl VARBINARY(MAX)-Spalten mit dem FILESTREAM-Attribut Binary-Objekten zugeordnet werden können, können von der DataContext.CreateDatabase-Methode keine Spalten mit dem FILESTREAM-Attribut automatisch erstellt werden. Weitere Informationen über FILESTREAM finden Sie in der Microsoft SQL Server-Onlinedokumentation unter Übersicht über FILESTREAM.
Binäre Serialisierung
Wenn eine Klasse die ISerializable-Schnittstelle implementiert, kann ein Objekt in ein beliebiges binäres SQL-Feld (BINARY, VARBINARY, IMAGE) serialisiert werden. Das Objekt wird je nach Implementierung der ISerializable-Schnittstelle serialisiert und deserialisiert. Weitere Informationen finden Sie unter Binäre Serialisierung.
Verschiedene Mappingtypen
In der folgenden Tabelle sind die Standardtypmappings für verschiedene Typen aufgeführt, die noch nicht erwähnt wurden. Die Tabelle enthält auch die CLR-Typen, die von O/R-Designer und SQLMetal für die auf einer bestehenden Datenbank basierende Erstellung eines Objektmodells oder einer externen Mappingdatei ausgewählt werden.
SQL Server-Typ |
Von O/R-Designer und SQLMetal verwendetes CLR-Standardtypmapping |
---|---|
UNIQUEIDENTIFIER |
|
SQL_VARIANT |
In der nächsten Tabelle werden die Standardtypmappings angezeigt, die von der DataContext.CreateDatabase-Methode verwendet werden, um festzulegen, welche Typen von SQL-Spalten für die Zuordnung zu den im Objektmodell oder der externen Mappingdatei definierten CLR-Typen erstellt werden.
CLR-Typ |
Von DataContext.CreateDatabase verwendeter SQL Server-Standardtyp |
---|---|
UNIQUEIDENTIFIER |
|
SQL_VARIANT |
LINQ to SQL unterstützt keine anderen Typmappings für diese Typen. Weitere Informationen finden Sie unter Laufzeitverhaltens-Matrix des Typmappings.
Siehe auch
Referenz
Attributbasierte Zuordnung (LINQ to SQL)
Referenz zur externen Zuordnung (LINQ to SQL)
SQL-CLR-Typenkonflikte (LINQ to SQL)