SQL-CLR 類型對應

在 LINQ to SQL 中,關係資料庫的數據模型會對應至以您選擇的程式設計語言表示的物件模型。 當應用程式執行時,LINQ to SQL 會將物件模型中的語言整合查詢轉譯為 SQL,並將其傳送至資料庫以供執行。 當資料庫傳回結果時,LINQ to SQL 會將結果轉譯回您可以使用自己的程式設計語言的物件。

若要在物件模型與資料庫之間轉譯數據,必須定義 類型對應 。 LINQ to SQL 會使用類型對應來比對每個 Common Language Runtime (CLR) 類型與特定的 SQL Server 類型。 您可以使用屬性型對應,在物件模型中定義類型對應和其他對應資訊,例如資料庫結構和數據表關聯性。 或者,您可以使用外部對應檔案來指定物件模型外部的對應資訊。 如需詳細資訊,請參閱 Attribute-Based 對應外部對應

本主題討論下列幾點:

預設類型對應

您可以使用物件關係型設計工具(O/R 設計工具)或 SQLMetal 命令行工具自動建立物件模型或外部對應檔案。 這些工具的預設類型對應會定義選擇哪些 CLR 類型來對應至 SQL Server 資料庫內的欄位。 如需使用這些工具的詳細資訊,請參閱 建立物件模型

您也可以使用 CreateDatabase 方法,根據物件模型或外部對應檔中的對應資訊來建立 SQL Server 資料庫。 CreateDatabase 方法的預設類型映射定義了要創建哪種類型的 SQL Server 資料行,以對應物件模型中的 CLR 類型。 如需詳細資訊,請參閱 如何:動態建立資料庫

型別映射執行時行為矩陣

下圖展示了特定類型映射在從資料庫擷取或儲存資料時預期的執行時行為。 除了串行化之外,LINQ to SQL 不支援在此矩陣中未指定之任何 CLR 或 SQL Server 數據類型之間的對應。 如需串行化支持的詳細資訊,請參閱 二進位串行化

SQL Server 至 SQL CLR 數據類型對應數據表

備註

某些類型映射在轉換至資料庫或從資料庫時,可能會造成溢位或數據遺失的例外狀況。

自定義類型對應

使用 LINQ to SQL,您不僅限於使用 O/R 設計工具、SQLMetal 和 CreateDatabase 方法所提供的預設類型對應。 您可以藉由在 DBML 檔案中明確指定它們來建立自定義類型對應。 然後,您可以使用該 DBML 檔案來建立物件模型程式代碼和對應檔案。 如需詳細資訊,請參閱 SQL-CLR 自定義類型對應

CLR 與 SQL 執行之間的行為差異

由於 CLR 與 SQL Server 之間的精確度與執行差異,您可能會根據執行計算的位置收到不同的結果或體驗不同的行為。 在 LINQ to SQL 查詢中執行的計算實際上會轉譯為 Transact-SQL,然後在 SQL Server 資料庫上執行。 在 LINQ to SQL 查詢外部執行的計算會於 CLR 上下文中進行。

例如,下列是CLR與 SQL Server 之間行為的一些差異:

  • SQL Server 會以不同於 CLR 中對等類型的數據排序某些數據類型。 例如,類型的 UNIQUEIDENTIFIER SQL Server 數據會以不同於 類型的 System.GuidCLR 數據排序。

  • SQL Server 會以與 CLR 不同的方式處理一些字串比較作業。 在 SQL Server 中,字串比較行為取決於伺服器上的定序設定。 如需詳細資訊,請參閱 使用定序

  • SQL Server 可能會針對某些對應的函式傳回與 CLR 不同的值。 例如,相等函式會有所不同,因為 SQL Server 會考慮兩個字元串只有在尾端空格符不同時才會相等;而 CLR 會將它們視為不相等。

列舉對應

LINQ to SQL 支援以兩種方式將 CLR System.Enum 類型對應至 SQL Server 類型:

  • 對應至 SQL 數值型態(TINYINTSMALLINTINTBIGINT

    當您將 CLR System.Enum 類型對應至 SQL 數值類型時,會將 CLR System.Enum 的基礎整數值對應至 SQL Server 資料庫數據行的值。 例如,如果System.Enum具名DaysOfWeekTue包含具有基礎整數值為 3 的成員,該成員就會對應至資料庫值 3。

  • 對應至 SQL 文字型態 (CHARNCHARVARCHARNVARCHAR

    當您將 CLR System.Enum 類型對應至 SQL 文字類型時,SQL 資料庫值會對應至 CLR System.Enum 成員的名稱。 例如,如果System.Enum名為DaysOfWeek,其包含的成員Tue有一個基礎整數值為3,該成員會對應到資料庫值Tue

備註

當將 SQL 文字類型對應到 CLR System.Enum時,請僅在對應的 SQL 資料行中包含 Enum 成員的名稱。 在 Enum 映射的 SQL 資料欄中不支援其他值。

O/R 設計工具和 SQLMetal 命令行工具無法自動將 SQL 類型對應至 CLR Enum 類別。 您必須藉由自定義 DBML 檔案來明確設定此對應,以供 O/R 設計工具和 SQLMetal 使用。 如需自定義類型對應的詳細資訊,請參閱 SQL-CLR 自定義類型對應

因為要列舉的 SQL 資料行會與其他數值和文字數據行的類型相同;這些工具無法辨識您的意圖,且預設為對應,如下列 數值對應文字和 XML 對應 小節所述。 如需使用 DBML 檔案產生程式代碼的詳細資訊,請參閱 LINQ to SQL 中的程式碼產生

方法 DataContext.CreateDatabase 會建立數值類型的 SQL 數據行,以對應 CLR System.Enum 類型。

數值對應

LINQ to SQL 可讓您對應許多 CLR 和 SQL Server 數值類型。 下表顯示根據資料庫建置物件模型或外部對應檔時,O/R 設計工具與 SQLMetal 選取的 CLR 類型。

SQL Server 類型 O/R 設計工具與 SQLMetal 所使用的預設 CLR 類型對應
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

下表顯示 DataContext.CreateDatabase 方法所用的預設類型對應,以定義建立的 SQL 資料行類型,這些資料行類型用來對應至物件模型或外部對應檔所定義的 CLR 類型。

CLR 型別 所使用的預設 SQL Server 類型 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

您可以選擇許多其他數值對應,但有些對應在轉譯至資料庫或從資料庫轉譯時,可能會導致溢位或數據遺失例外狀況。 如需詳細資訊,請參閱 類型對應運行時間行為矩陣

十進位和貨幣類型

SQL Server DECIMAL 類型的預設有效位數(小數點左邊和右邊的 18 個小數位數)遠小於預設與它配對之 CLR System.Decimal 類型的精確度。 當您將數據儲存至資料庫時,這可能會導致精確度遺失。 不過,如果 SQL Server DECIMAL 類型設定的精確度大於 29 位數,就可能發生相反的情況。 當 SQL Server DECIMAL 類型設定的精確度高於 CLR System.Decimal時,從資料庫擷取數據時,可能會發生精確度遺失。

根據預設,SQL Server MONEYSMALLMONEY 類型也會與 CLR System.Decimal 類型配對,其精確度要小得多,在將數據儲存至資料庫時,可能會導致溢位或數據遺失例外狀況。

文字和 XML 對應

您也可以使用 LINQ to SQL 對應許多以文字為基礎的和 XML 類型。 下表顯示根據資料庫建置物件模型或外部對應檔時,O/R 設計工具與 SQLMetal 選取的 CLR 類型。

SQL Server 類型 O/R 設計工具與 SQLMetal 所使用的預設 CLR 類型對應
CHAR System.String
NCHAR System.String
VARCHAR System.String
NVARCHAR System.String
TEXT System.String
NTEXT System.String
XML System.Xml.Linq.XElement

下表顯示 DataContext.CreateDatabase 方法所用的預設類型對應,以定義建立的 SQL 資料行類型,這些資料行類型用來對應至物件模型或外部對應檔所定義的 CLR 類型。

CLR 型別 所使用的預設 SQL Server 類型 DataContext.CreateDatabase
System.Char NCHAR(1)
System.String NVARCHAR(4000)
Boolean[] NVARCHAR(4000)
自定義類型 Parse() 實作 ToString() NVARCHAR(MAX)

您可以選擇許多其他以文字為基礎的和 XML 對應,但有些對應在轉譯至資料庫或從資料庫轉譯時,可能會導致溢位或數據遺失例外狀況。 如需詳細資訊,請參閱 類型對應運行時間行為矩陣

XML 類型

從 MICROSOFT SQL Server 2005 開始,即可使用 SQL Server XML 數據類型。 您可以將 SQL Server XML 資料類型對應至 XElementXDocumentString。 若欄位儲存無法讀取的 XElementXML 片段,則必須將欄位映射至 String ,以避免執行時錯誤。 必須映射到 String 的 XML 片段包括下列內容:

  • XML 元素序列

  • 屬性

  • 公用識別碼 (PI)

  • 評論

雖然您可以依照XElement所示,將XDocument對應至 SQL Server,但是DataContext.CreateDatabase方法對這些類型沒有預設的 SQL Server 類型對應。

自訂類型

如果類別實作 Parse()ToString(),您可以將物件對應至任何 SQL 文字類型(CHARNCHAR、、VARCHAR、、NVARCHARTEXTNTEXTXML。 物件會透過將 ToString() 回傳的值傳送到映射的資料庫欄位,儲存在資料庫中。 藉由叫用 Parse() 資料庫所傳回的字串,重新建構 物件。

備註

LINQ to SQL 不支援使用 System.Xml.Serialization.IXmlSerializable串行化。

日期與時間映射

透過 LINQ to SQL,您可以對應許多 SQL Server 日期和時間類型。 下表顯示根據資料庫建置物件模型或外部對應檔時,O/R 設計工具與 SQLMetal 選取的 CLR 類型。

SQL Server 類型 O/R 設計工具與 SQLMetal 所使用的預設 CLR 類型對應
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

下表顯示 DataContext.CreateDatabase 方法所用的預設類型對應,以定義建立的 SQL 資料行類型,這些資料行類型用來對應至物件模型或外部對應檔所定義的 CLR 類型。

CLR 型別 所使用的預設 SQL Server 類型 DataContext.CreateDatabase
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

您可以選擇許多其他日期和時間對應,但有些對應在轉譯至資料庫或從資料庫轉譯時,可能會導致溢位或數據遺失例外狀況。 如需詳細資訊,請參閱 類型對應運行時間行為矩陣

備註

從 MICROSOFT SQL Server 2008 開始,可以使用 SQL Server 類型 DATETIME2DATETIMEOFFSETDATETIME 。 LINQ to SQL 支援從 .NET Framework 3.5 版 SP1 開始對應至這些新類型。

System.Datetime(系統日期時間)

CLR System.DateTime 類型的範圍和有效位數大於 SQL Server DATETIME 類型的範圍和有效位數,而 DataContext.CreateDatabase 方法的預設類型對應就是如此。 若要協助避免範圍之外的日期相關例外狀況,請使用DATETIME,此功能自 Microsoft SQL Server 2008 開始提供。 DATETIME2 可以匹配 CLR System.DateTime 的範圍和精度。

SQL Server 日期沒有 TimeZone 的概念,這是 CLR 支援得很豐富的功能。 TimeZone 值會按原樣儲存至資料庫,不論原始TimeZone信息為何,不需DateTimeKind轉換。 當從資料庫擷取DateTime值時,其值會原樣載入至具有DateTimeDateTimeKindUnspecified中。 如需支援 System.DateTime 方法的詳細資訊,請參閱 System.DateTime 方法

System.TimeSpan

Microsoft SQL Server 2008 和 .NET Framework 3.5 SP1 可讓您將 CLR System.TimeSpan 類型對應至 SQL Server TIME 類型。 不過,CLR System.TimeSpan 支援的範圍和 SQL Server TIME 類型支援的範圍之間有很大的差異。 將小於 0 或大於 23:59:59.9999999 小時的值對應至 SQL TIME 將會導致溢位例外狀況。 如需詳細資訊,請參閱 System.TimeSpan 方法

在 Microsoft SQL Server 2000 和 SQL Server 2005 中,您無法將資料庫欄位對應至 TimeSpan。 不過,TimeSpan 支援操作,因為 TimeSpan 的值可以透過 DateTime 的減法傳回,或者作為常量或綁定變數引入至運算式中。

二進位對應

有許多 SQL Server 類型可以對應至 CLR 類型 System.Data.Linq.Binary。 下表顯示 SQL Server 類型,在根據資料庫建置物件模型或外部對應檔時,導致 O/R 設計師與 SQLMetal 定義 CLR System.Data.Linq.Binary 類型。

SQL Server 類型 O/R 設計工具與 SQLMetal 所使用的預設 CLR 類型對應
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
VARBINARY(MAX)使用FILESTREAM屬性 System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

下表顯示 DataContext.CreateDatabase 方法所用的預設類型對應,以定義建立的 SQL 資料行類型,這些資料行類型用來對應至物件模型或外部對應檔所定義的 CLR 類型。

CLR 型別 所使用的預設 SQL Server 類型 DataContext.CreateDatabase
System.Data.Linq.Binary VARBINARY(MAX)
System.Byte VARBINARY(MAX)
System.Runtime.Serialization.ISerializable VARBINARY(MAX)

您可以選擇許多其他二進位對應,但有些對應在轉譯至資料庫或從資料庫轉譯時,可能會導致溢位或數據遺失例外狀況。 如需詳細資訊,請參閱 類型對應運行時間行為矩陣

SQL Server 檔案流

自 Microsoft SQL Server 2008 起,FILESTREAM 欄的屬性 VARBINARY(MAX) 可用;您可以從 .NET Framework 3.5 SP1 版開始,使用 LINQ to SQL 以對應至此屬性。

雖然您可以將具有 VARBINARY(MAX) 屬性的FILESTREAM欄位對應至Binary物件,但DataContext.CreateDatabase方法無法自動建立具有FILESTREAM屬性的欄位。 如需 的詳細資訊 FILESTREAM,請參閱 FILESTREAM 概觀

二進位串行化

如果類別實作 ISerializable 介面,您可以將物件串行化至任何 SQL 二進位欄位 (BINARY、 、 VARBINARYIMAGE 物件會根據 ISerializable 介面的實作方式進行序列化和反序列化。 如需詳細資訊,請參閱 二進位串行化

其他對應

下表顯示尚未提及之某些其他類型的默認類型對應。 下表顯示根據資料庫建置物件模型或外部對應檔時,O/R 設計工具與 SQLMetal 選取的 CLR 類型。

SQL Server 類型 O/R 設計工具與 SQLMetal 所使用的預設 CLR 類型對應
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

下表顯示 DataContext.CreateDatabase 方法所用的預設類型對應,以定義建立的 SQL 資料行類型,這些資料行類型用來對應至物件模型或外部對應檔所定義的 CLR 類型。

CLR 型別 所使用的預設 SQL Server 類型 DataContext.CreateDatabase
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL 不支援這些雜項類型的其他類型對應。 如需詳細資訊,請參閱 類型對應運行時間行為矩陣

另請參閱