Mapowania typów środowiska SQL-CLR

W linQ to SQL model danych relacyjnej bazy danych jest mapowy na model obiektów 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 Mapowanie oparte na atrybutach 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ą Projektant relacyjnych obiektów (O/R Projektant) 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 CreateDatabase metody definiują typ kolumn programu SQL Server do mapowania na typy CLR w modelu obiektów. Aby uzyskać więcej informacji, zobacz Instrukcje: dynamiczne tworzenie bazy danych.

Macierz zachowania mapowania typu 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.

SQL Server to SQL CLR data type mapping table

Uwaga

Niektóre mapowania typów mogą powodować przepełnienie lub wyjątki utraty danych podczas tłumaczenia na bazę danych lub z bazy danych.

Mapowanie typów niestandardowych

W przypadku linQ to SQL nie jest ograniczone do domyślnych mapowań typów używanych przez Projektant 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 Custom Type Mappings (Mapowania typów niestandardowych SQL-CLR).

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 język 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 sortowaniami.

  • 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 odstępami; mając na uwadze, że 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 na typ liczbowy SQL mapujesz podstawową wartość całkowitą CLR System.EnumSystem.Enum na wartość kolumny bazy danych programu SQL Server. Jeśli na przykład nazwana System.EnumDaysOfWeek zawiera element członkowski o nazwie o Tue bazowej wartości całkowitej 3, element członkowski jest mapowy na wartość bazy 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 nazwana System.EnumDaysOfWeek zawiera element członkowski o nazwie o Tue bazowej wartości całkowitej 3, element członkowski mapuje wartość bazy danych na Tuewartość .

Uwaga

Podczas mapowania typów tekstu SQL na CLR System.Enumuwzględnij tylko nazwy Enum elementów członkowskich w mapowanej kolumnie SQL. Inne wartości nie są obsługiwane w kolumnie Enum-mapped SQL.

Narzędzie wiersza polecenia O/R Projektant i SQLMetal nie może automatycznie mapować typu SQL na klasę CLREnum. To mapowanie należy jawnie skonfigurować, dostosowując plik DBML do użycia przez Projektant O/R i SQLMetal. Aby uzyskać więcej informacji na temat mapowania typów niestandardowych, zobacz Mapowania typów niestandardowych SQL-CLR.

Ponieważ kolumna SQL przeznaczona do wyliczenia będzie mieć taki sam typ jak inne kolumny liczbowe i tekstowe; te narzędzia nie rozpoznają intencji i domyślnego mapowania zgodnie z opisem w poniższych sekcjach Mapowanie liczbowe i Tekstowe i Mapowanie 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, które Projektant O/R i SQLMetal wybierane 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 Projektant 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 przedstawiono domyślne mapowania typów używane przez DataContext.CreateDatabase metodę do definiowania typu kolumn SQL do mapowania na typy CLR zdefiniowane w modelu obiektów lub pliku mapowania zewnętrznego.

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 tłumaczenia na bazę danych lub z niej. Aby uzyskać więcej informacji, zobacz Macierz zachowania czasu 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. Jednak w przeciwnym razie typ programu SQL Server DECIMAL jest 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.

Program SQL Server MONEY i SMALLMONEY typy, które są również domyślnie sparowane z typem CLR System.Decimal , mają znacznie mniejszą precyzję, co może spowodować przepełnienie lub wyjątki 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, które Projektant O/R i SQLMetal wybierane 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 Projektant 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 przedstawiono domyślne mapowania typów używane przez DataContext.CreateDatabase metodę do definiowania typu kolumn SQL do mapowania na typy CLR zdefiniowane w modelu obiektów lub pliku mapowania zewnętrznego.

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)
Implementowanie Parse() typu niestandardowego 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 podczas tłumaczenia na bazę danych lub z niej. Aby uzyskać więcej informacji, zobacz Macierz zachowania czasu 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ć do XElementelementu , należy zamapować kolumnę, aby String uniknąć błędów czasu wykonywania. Fragmenty XML, które muszą być mapowane, aby String zawierały następujące elementy:

  • 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, , VARCHARTEXTNVARCHAR, , 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

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, które Projektant O/R i SQLMetal wybierane 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 Projektant 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 przedstawiono domyślne mapowania typów używane przez DataContext.CreateDatabase metodę do definiowania typu kolumn SQL do mapowania na typy CLR zdefiniowane w modelu obiektów lub pliku mapowania zewnętrznego.

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, zobacz Macierz zachowania czasu wykonywania mapowania typów.

Uwaga

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 odpowiadać zakresowi i precyzji środowiska CLR System.DateTime.

Daty programu SQL Server nie mają pojęcia , TimeZonefunkcji, która jest bogato obsługiwana w środowisku CLR. TimeZone wartości są zapisywane tak jak w bazie danych bez TimeZone konwersji, niezależnie od oryginalnych DateTimeKind informacji. Gdy DateTime wartości są pobierane z bazy danych, ich wartość jest ładowana jako do elementu DateTime z wartością DateTimeKindUnspecified. 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 włączone TimeSpan są obsługiwane, ponieważ TimeSpan wartości mogą być zwracane z DateTime odejmowania lub wprowadzane do wyrażenia jako literału lub zmiennej powiązanej.

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 Projektant 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 przedstawiono domyślne mapowania typów używane przez DataContext.CreateDatabase metodę do definiowania typu kolumn SQL do mapowania na typy CLR zdefiniowane w modelu obiektów lub pliku mapowania zewnętrznego.

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ą powodować przepełnienie lub wyjątki utraty danych podczas tłumaczenia na bazę danych lub z niej. Aby uzyskać więcej informacji, zobacz Macierz zachowania czasu wykonywania mapowania typów.

SQL Server FILESTREAM

Atrybut FILESTREAM kolumn VARBINARY(MAX) jest dostępny począwszy od programu Microsoft SQL Server 2008. Można go mapować przy użyciu linQ to SQL, począwszy od programu .NET Framework w wersji 3.5 z dodatkiem SP1.

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 FILESTREAMprogramu , 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óżne

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, które Projektant O/R i SQLMetal wybierane 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 Projektant O/R i SQLMetal
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

W następnej tabeli przedstawiono domyślne mapowania typów używane przez DataContext.CreateDatabase metodę do definiowania typu kolumn SQL do mapowania na typy CLR zdefiniowane w modelu obiektów lub pliku mapowania zewnętrznego.

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, zobacz Macierz zachowania czasu wykonywania mapowania typów.

Zobacz też