Udostępnij za pośrednictwem


mapowanie typów SQL-CLR

W LINQ to SQL model danych relacyjnej bazy danych jest mapowany na model obiektowy wyrażony w wybranym języku programowania. Po uruchomieniu aplikacji linQ to SQL tłumaczy zapytania zintegrowane z językiem w modelu obiektów na język SQL i wysyła je do bazy danych w celu wykonania. Gdy baza danych zwraca wyniki, LINQ to SQL tłumaczy wyniki z powrotem na obiekty, z którymi można pracować we własnym języku programowania.

Aby przetłumaczyć dane między modelem obiektów a bazą danych, należy zdefiniować mapowanie typów . LINQ to SQL używa mapowania typów, aby dopasować każdy typ środowiska uruchomieniowego języka wspólnego (CLR) z określonym typem programu SQL Server. Można zdefiniować mapowania typów i inne informacje o mapowaniu, takie jak struktura bazy danych i relacje tabel, wewnątrz modelu obiektów z mapowaniem opartym na atrybutach. Alternatywnie można określić informacje o mapowaniu poza modelem obiektów za pomocą pliku mapowania zewnętrznego. Aby uzyskać więcej informacji, zobacz Attribute-Based Mapowanie i Mapowanie zewnętrzne.

W tym temacie omówiono następujące kwestie:

Mapowanie typów domyślnych

Model obiektów lub plik mapowania zewnętrznego można utworzyć automatycznie za pomocą projektanta relacyjnego obiektów (O/R Designer) lub narzędzia wiersza polecenia SQLMetal. Domyślne mapowania typów dla tych narzędzi definiują, które typy CLR są wybierane do mapowania na kolumny w bazie danych programu SQL Server. Aby uzyskać więcej informacji na temat korzystania z tych narzędzi, zobacz Tworzenie modelu obiektów.

Możesz również użyć CreateDatabase metody , aby utworzyć bazę danych programu SQL Server na podstawie informacji o mapowaniu w modelu obiektów lub pliku mapowania zewnętrznego. Domyślne mapowania typów dla metody CreateDatabase określają, które typy kolumn na serwerze SQL są tworzone w celu odwzorowania na typy CLR w modelu obiektowego. Aby uzyskać więcej informacji, zobacz Instrukcje: dynamiczne tworzenie bazy danych.

Macierz zachowania mapowania typów w czasie wykonywania

Na poniższym diagramie przedstawiono oczekiwane zachowanie czasu wykonywania określonych mapowań typów, gdy dane są pobierane z bazy danych lub zapisywane w bazie danych. Z wyjątkiem serializacji LINQ to SQL nie obsługuje mapowania między żadnymi typami danych CLR lub SQL Server, które nie zostały określone w tej macierzy. Aby uzyskać więcej informacji na temat obsługi serializacji, zobacz Serializacja binarna.

Tabela mapowania typu danych SQL Server to SQL CLR

Uwaga / Notatka

Niektóre mapowania typów mogą powodować przepełnienia lub wyjątki utraty danych podczas przesyłania do bazy danych lub pobierania z bazy danych.

Mapowanie typów niestandardowych

W przypadku LINQ to SQL nie jesteś ograniczony do domyślnych odwzorowań typów używanych przez projektanta O/R, SQLMetal i metodę CreateDatabase. Mapowania typów niestandardowych można tworzyć, jawnie określając je w pliku DBML. Następnie możesz użyć tego pliku DBML, aby utworzyć kod modelu obiektów i plik mapowania. Aby uzyskać więcej informacji, zobacz SQL-CLR mapowania typów niestandardowych.

Różnice między zachowaniem środowiska CLR i wykonywania SQL

Ze względu na różnice w precyzji i wykonywaniu między clR i SQL Server, mogą być wyświetlane różne wyniki lub różne zachowanie w zależności od tego, gdzie wykonujesz obliczenia. Obliczenia wykonywane w zapytaniach LINQ to SQL są w rzeczywistości tłumaczone na Transact-SQL, a następnie wykonywane w bazie danych programu SQL Server. Obliczenia wykonywane poza zapytaniami LINQ to SQL są wykonywane w kontekście środowiska CLR.

Na przykład poniżej przedstawiono pewne różnice w zachowaniu środowiska CLR i programu SQL Server:

  • Program SQL Server zamawia niektóre typy danych inaczej niż dane równoważnego typu w środowisku CLR. Na przykład dane typu UNIQUEIDENTIFIER programu SQL Server są uporządkowane inaczej niż dane CLR typu System.Guid.

  • Program SQL Server obsługuje niektóre operacje porównania ciągów inaczej niż CLR. W programie SQL Server zachowanie porównania ciągów zależy od ustawień sortowania na serwerze. Aby uzyskać więcej informacji, zobacz Praca z kolacjami.

  • Program SQL Server może zwracać różne wartości dla niektórych zamapowanych funkcji niż CLR. Na przykład funkcje równości będą się różnić, ponieważ program SQL Server uważa, że dwa ciągi są równe, jeśli różnią się tylko końcowymi spacjami, podczas gdy CLR uważa, że nie są równe.

Mapowanie wyliczenia

LinQ to SQL obsługuje mapowanie typu CLR System.Enum na typy programu SQL Server na dwa sposoby:

  • Mapowanie na typy liczbowe SQL (TINYINT, SMALLINT, INT, BIGINT)

    Podczas mapowania typu CLR System.Enum na typ liczbowy SQL mapujesz ukrytą wartość całkowitą CLR System.Enum na wartość kolumny w bazie danych SQL Server. Na przykład, jeśli System.Enum o nazwie DaysOfWeek zawiera element członkowski o nazwie Tue z wartością bazową całkowitą 3, ten element członkowski jest mapowany na wartość w bazie danych 3.

  • Mapowanie na typy tekstu SQL (CHAR, NCHAR, VARCHAR, NVARCHAR)

    Podczas mapowania typu CLR System.Enum na typ tekstu SQL wartość bazy danych SQL jest mapowana na nazwy elementów członkowskich CLR System.Enum . Jeśli na przykład System.Enum, DaysOfWeek zawiera element członkowski o nazwie Tue z bazową wartości całkowitą 3, ten element członkowski mapuje wartość bazy danych na Tue.

Uwaga / Notatka

Podczas mapowania typów tekstu SQL na CLR System.Enum należy uwzględnić tylko nazwy Enum członków w mapowanej kolumnie SQL. Inne wartości nie są obsługiwane w kolumnie SQL powiązanej z Enum.

Narzędzie wiersza polecenia O/R Designer i SQLMetal nie mogą automatycznie mapować typu SQL na klasę CLR Enum . Aby skonfigurować to mapowanie w sposób jawny, należy dostosować plik DBML do użycia przez projektanta O/R i SQLMetal. Aby uzyskać więcej informacji na temat niestandardowego mapowania typów, zobacz SQL-CLR Mapowania typów niestandardowych.

Ponieważ kolumna SQL przeznaczona do wyliczenia będzie mieć taki sam typ jak inne kolumny liczbowe i tekstowe, narzędzia te nie rozpoznają Twojej intencji i automatycznie zastosują mapowanie zgodnie z opisem w poniższych sekcjach Mapowanie liczbowe oraz Mapowanie tekstowe i XML. Aby uzyskać więcej informacji na temat generowania kodu za pomocą pliku DBML, zobacz Generowanie kodu w linQ to SQL.

Metoda DataContext.CreateDatabase tworzy kolumnę SQL typu liczbowego w celu mapowania typu CLR System.Enum .

Mapowanie liczbowe

LINQ to SQL umożliwia mapowanie wielu typów liczbowych CLR i SQL Server. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.

Typ programu SQL Server Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal
BIT System.Boolean
TINYINT System.Int16
INT System.Int32
BIGINT System.Int64
SMALLMONEY System.Decimal
MONEY System.Decimal
DECIMAL System.Decimal
NUMERIC System.Decimal
REAL/FLOAT(24) System.Single
FLOAT/FLOAT(53) System.Double

W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.

Typ CLR Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase
System.Boolean BIT
System.Byte TINYINT
System.Int16 SMALLINT
System.Int32 INT
System.Int64 BIGINT
System.SByte SMALLINT
System.UInt16 INT
System.UInt32 BIGINT
System.UInt64 DECIMAL(20)
System.Decimal DECIMAL(29,4)
System.Single REAL
System.Double FLOAT

Istnieje wiele innych mapowań liczbowych, które można wybrać, ale niektóre mogą powodować przepełnienie lub wyjątki utraty danych podczas konwersji do lub z bazy danych. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.

Typy dziesiętne i pieniężne

Domyślna precyzja typu programu SQL Server DECIMAL (18 cyfr dziesiętnych z lewej i prawej strony punktu dziesiętnego) jest znacznie mniejsza niż precyzja typu CLR System.Decimal , z którym jest domyślnie sparowana. Może to spowodować utratę dokładności podczas zapisywania danych w bazie danych. Wręcz przeciwnie może się zdarzyć, jeśli typ SQL Server DECIMAL zostanie skonfigurowany z dokładnością większą niż 29 cyfr. Jeśli typ programu SQL Server DECIMAL został skonfigurowany z większą dokładnością niż CLR System.Decimal, utrata dokładności może wystąpić podczas pobierania danych z bazy danych.

SQL Server MONEY i SMALLMONEY, które domyślnie są powiązane z typem CLR System.Decimal, mają znacznie niższą precyzję, co może prowadzić do przepełnienia lub utraty danych podczas zapisywania danych w bazie danych.

Mapowanie tekstu i xml

Istnieje również wiele typów tekstowych i XML, które można mapować za pomocą linQ to SQL. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.

Typ programu SQL Server Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal
CHAR System.String
NCHAR System.String
VARCHAR System.String
NVARCHAR System.String
TEXT System.String
NTEXT System.String
XML System.Xml.Linq.XElement

W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.

Typ CLR Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase
System.Char NCHAR(1)
System.String NVARCHAR(4000)
System.Char[] NVARCHAR(4000)
Niestandardowy typ implementujący Parse() i ToString() NVARCHAR(MAX)

Istnieje wiele innych mapowań tekstowych i XML, które można wybrać, ale niektóre mogą powodować przepełnienie lub wyjątki utraty danych przy przesyłaniu danych do lub z bazy danych. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.

Typy XML

Typ danych programu SQL Server XML jest dostępny od programu Microsoft SQL Server 2005. Typ danych programu SQL Server XML można mapować na XElement, XDocumentlub String. Jeśli kolumna przechowuje fragmenty XML, których nie można odczytać jako XElement, kolumna musi być zamapowana do String, aby uniknąć błędów czasu wykonywania. Fragmenty XML, które muszą być mapowane na String, obejmują następujące:

  • Sekwencja elementów XML

  • Atrybuty

  • Identyfikatory publiczne (PI)

  • Komentarze

Mimo że można mapować XElement i XDocument na program SQL Server, jak pokazano w macierzy zachowań czasu wykonywania mapowania typów, DataContext.CreateDatabase metoda nie ma domyślnego mapowania typów programu SQL Server dla tych typów.

Typy niestandardowe

Jeśli klasa implementuje Parse() i ToString(), można mapować obiekt na dowolny typ tekstu SQL (CHAR, NCHAR, , VARCHARNVARCHARTEXT, , NTEXT, XML). Obiekt jest przechowywany w bazie danych, wysyłając wartość zwróconą przez ToString() do zamapowanej kolumny bazy danych. Obiekt jest odtwarzany przez wywołanie Parse() ciągu zwróconego przez bazę danych.

Uwaga / Notatka

LINQ to SQL nie obsługuje serializacji przy użyciu polecenia System.Xml.Serialization.IXmlSerializable.

Mapowanie daty i godziny

Za pomocą linQ to SQL można mapować wiele typów dat i godzin programu SQL Server. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.

Typ programu SQL Server Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.

Typ CLR Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

Istnieje wiele innych mapowań daty i godziny, które można wybrać, ale niektóre mogą powodować przepełnienie lub wyjątki utraty danych podczas tłumaczenia na bazę danych lub z niej. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.

Uwaga / Notatka

Typy programu DATETIME2SQL Server, DATETIMEOFFSET, DATEi TIME są dostępne od programu Microsoft SQL Server 2008. LinQ to SQL obsługuje mapowanie na te nowe typy, począwszy od programu .NET Framework w wersji 3.5 SP1.

System.Datetime

Zakres i precyzja typu CLR System.DateTime jest większa niż zakres i precyzja typu programu SQL Server DATETIME , który jest domyślnym mapowaniem typów dla DataContext.CreateDatabase metody . Aby uniknąć wyjątków związanych z datami spoza zakresu DATETIME, użyj programu DATETIME2, który jest dostępny od programu Microsoft SQL Server 2008. DATETIME2 może dorównywać zakresem i precyzją CLR System.DateTime.

Daty w SQL Server nie obsługują TimeZone, funkcji, która jest szeroko wspierana w środowisku CLR. TimeZone wartości są zapisywane bezpośrednio do bazy danych, bez TimeZone konwersji, niezależnie od oryginalnych DateTimeKind danych. Gdy wartości DateTime są pobierane z bazy danych, ich wartość jest ładowana bez zmian do obiektu DateTime z DateTimeKind o wartości Unspecified. Aby uzyskać więcej informacji na temat obsługiwanych System.DateTime metod, zobacz Metody System.DateTime.

System.TimeSpan

Programy Microsoft SQL Server 2008 i .NET Framework 3.5 SP1 umożliwiają mapowania typu CLR System.TimeSpan na typ programu SQL Server TIME . Istnieje jednak duża różnica między zakresem, który obsługuje CLR System.TimeSpan , a tym, co obsługuje typ programu SQL Server TIME . Mapowanie wartości mniejszych niż 0 lub większe niż 23:59:59.99999999 godzin dla bazy danych SQL TIME spowoduje wyjątki przepełnienia. Aby uzyskać więcej informacji, zobacz Metody System.TimeSpan.

W programach Microsoft SQL Server 2000 i SQL Server 2005 nie można mapować pól bazy danych na TimeSpan. Jednak operacje na TimeSpan są obsługiwane, ponieważ wartości TimeSpan mogą być zwracane z działania odejmowania DateTime lub wprowadzane do wyrażenia jako wartość dosłowna lub zmienna powiązana.

Mapowanie binarne

Istnieje wiele typów programu SQL Server, które mogą być mapowane na typ System.Data.Linq.BinaryCLR. W poniższej tabeli przedstawiono typy programu SQL Server, które powodują, że projektant O/R i SQLMetal definiują typ CLR System.Data.Linq.Binary podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.

Typ programu SQL Server Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
VARBINARY(MAX)z atrybutem FILESTREAM System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.

Typ CLR Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase
System.Data.Linq.Binary VARBINARY(MAX)
System.Byte VARBINARY(MAX)
System.Runtime.Serialization.ISerializable VARBINARY(MAX)

Istnieje wiele innych mapowań binarnych, które można wybrać, ale niektóre mogą prowadzić do przepełnienia lub wyjątków utraty danych podczas konwersji do lub z bazy danych. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.

SQL Server FILESTREAM

Atrybut FILESTREAM kolumn VARBINARY(MAX) jest dostępny począwszy od programu Microsoft SQL Server 2008, a mapowanie do niego przy użyciu LINQ to SQL jest możliwe począwszy od wersji 3.5 z dodatkiem SP1 programu .NET Framework.

Chociaż można mapować VARBINARY(MAX) kolumny z atrybutem FILESTREAM na Binary obiekty, DataContext.CreateDatabase metoda nie może automatycznie tworzyć kolumn z atrybutem FILESTREAM . Aby uzyskać więcej informacji na temat FILESTREAM, zobacz FILESTREAM Overview (Omówienie funkcji FILESTREAM).

Serializacja binarna

Jeśli klasa implementuje ISerializable interfejs, można serializować obiekt do dowolnego pola binarnego SQL (BINARY, VARBINARY, IMAGE). Obiekt jest serializowany i deserializowany zgodnie z implementacją interfejsu ISerializable . Aby uzyskać więcej informacji, zobacz Serializacja binarna.

Mapowanie różnorodne

W poniższej tabeli przedstawiono domyślne mapowania typów dla niektórych różnych typów, które nie zostały jeszcze wymienione. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.

Typ programu SQL Server Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.

Typ CLR Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL nie obsługuje żadnych innych mapowań typów dla tych różnych typów. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.

Zobacz także