萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> 托管 UDT 使您能夠擴展 SQL Server 的類型系統

托管 UDT 使您能夠擴展 SQL Server 的類型系統

本文基於 Microsoft sql server 代號“Yukon”的 Beta 1 版本,文中所有信息都有可能發生變化。www.iTbulo.comR9jWYOn

下載本文的代碼:UDTsinYukon.exe (112KB)www.iTbulo.comR9jWYOn

注:本文是在產品投放生產之前編寫的,因此,我們無法保證此處包含的任何細節都與在交付使用的產品中發現的細節完全一致。文中信息描述的是本文發布之時的產品,僅供規劃之用。這些信息可在任何時候更改,恕不預先通知。www.iTbulo.comR9jWYOn

不透明或抽象類型 不透明或抽象類型 創建程序集 創建程序集 類屬性 類屬性 比較 UDT 的值 比較 UDT 的值 為空性 為空性 支持的轉換 支持的轉換 其他要求 其他要求 在 SQL Server 中使用 UDT 創建程序集 在 SQL Server 中使用 UDT 創建程序集 創建類型 創建類型 使用 UDT 使用 UDT 刪除和更改 UDT 以及程序集 刪除和更改 UDT 以及程序集 小結 小結 www.iTbulo.comR9jWYOn

用戶定義類型 (UDT) 是 SQL Server™ 下一個版本(代號“Yukon”)中新的公共語言運行庫 (CLR) 的集成功能之一。Yukon 中的 UDT 標志著自 SQL Server 以前版本以來一個顯著的進步。例如,SQL Server 2000 支持別名類型,可以為用戶提供一種重新定義本機類型的簡單方法。別名類型是使用現有數據類型創建的,現有數據類型在多個位置(表、過程等)以相同的方式定義。例如,一個郵政編碼可能在多個表中使用,並作為多個存儲過程中的一個參數。可以用如下方法創建一個名為 ZIP 的類型:www.iTbulo.comR9jWYOn

EXEC sp_addtype ZIP, 'CHAR(5)', 'NOT NULL'

接下來便可以在任何需要郵政編碼的地方使用 ZIP,而不是 char(5) NOT NULL,並且也不必擔心與同樣存儲郵政編碼的其他表中的其他字段保持一致的問題。注意 ZIP 上有一個附加的約束 — NOT NULL。這一約束強制字段必須有一個值,因此使用該類型將不允許空值。您可以創建規則和默認對象並將它們綁定到別名類型,從而進一步地實施和維護數據完整性。例如,可以創建一個只允許數字值的規則並將其綁定到 ZIP 類型。這一技術有強大的設計和實現優勢,例如更有組織的以及更一致的數據結構將產生更一致的數據。www.iTbulo.comR9jWYOn

在 Yukon 中,系統存儲過程 sp_addtype 被新的數據描述語言 (DDL) 語法 CREATE TYPE 所替代。前面的例子可以寫成下面這樣:www.iTbulo.comR9jWYOn

CREATE TYPE ZIP FROM char(5) NOT NULL

Yukon UDT 允許用戶編寫 Microsoft .NET 框架類,這些框架類能夠在 SQL 語言類型系統中注冊為標量類型。這使得 Yukon UDT 與任何其他 SQL 本機類型地位相同。Yukon UDT 被編譯成能夠在數據庫內部注冊並存儲的 .NET 程序集。一旦程序集存儲到數據庫中,用戶能夠使用 CREATE TYPE 語句的擴展將該程序集中的類定義為類型,相關內容將在本文的後面詳細闡述。要讓一個 .NET 框架類作為 SQL 類型系統中的類型,它必須實現一個協定 — 一組接口和方法,在 CREATE TYPE 時由 Yukon 進行驗證。定義和實現 .NET 程序集中定義的 UDT 能夠進行更為靈活的類型設計,不僅可以存儲結構化的類型,而且還允許自定義方法、屬性以及數據的序列化。www.iTbulo.comR9jWYOn

該功能有幾個優點。它是擴展數據庫標量類型系統的一個強有力的方法。這一可擴展性機制非常健壯,您可以使用它在數據庫中存儲類型的實例,以及在許多上下文中運行它們(作為變量、存儲過程的參數以及函數的值),並在幾乎所有能夠使用本機類型的地方使用它們,包括諸如復制、大量復制、分布式查詢和跨數據庫操作之類的高級場景中。另外,您可以將定義在類型上的行為作為查詢的一部分來調用,甚至能對調用這種行為的結果建立索引以加速查詢的執行。www.iTbulo.comR9jWYOn

UDT 的另一個優點是封裝。類型的狀態以及在類型上的操作常常可作為一個單元來使用。類型上的方法控制對狀態的訪問,使您能夠自由地使用熟悉的 OO 范例來考慮類型,並產生其他應用程序開發人員能夠使用的可重用組件。在本文的後面,我將討論用 .NET 代碼實現 UDT 的各種方面,以及在 Yukon 中使用結果類作為數據類型的問題。www.iTbulo.comR9jWYOn

不透明或抽象類型

Yukon UDT 可以作為不透明或者抽象數據類型,因為類型的使用者不了解類型執行的內部細節。他們僅通過類型的公共接口與類型進行交互。這一定義 UDT 的新技術為數據庫設計開啟了新的大門。既然 UDT 可以是具有屬性、方法等的托管類型,那麼您現在可以創建類型來代表大量以前在 SQL Server 中沒有的數據結構。使用 UDT,您能夠創建代表地理空間(位置和地圖類型的數據)、自定義二進制數據、編碼數據以及加密數據的數據結構。www.iTbulo.comR9jWYOn

您可以使用實現 UDT 協定的托管代碼來創建一個類,從而擴展 SQL 類型系統。接下來使用 CREATE ASSEMBLY 語句將包含 UDT 的已編譯程序集加載到服務器上的數據庫中,並使用公開托管代碼 UDT 的 CREATE TYPE 語句在數據庫中創建類型。www.iTbulo.comR9jWYOn

這時,您可以在表定義或變量聲明中使用該類型。讓我們從檢查 UDT 托管代碼需求開始。www.iTbulo.comR9jWYOn

返回頁首返回頁首

創建程序集

為了在 .NET 中創建可用於 Yukon 的程序集,有幾點要求需要注意。這裡,我先不講述創建 .NET 程序集的基本內容。有關此問題的更多信息,請參閱 Microsoft .NET tutorials 中的文章。www.iTbulo.comR9jWYOn

您將利用在 UDT 開發中用到的幾個命名空間。為了使您的開發工作更為容易,加入如下指令:www.iTbulo.comR9jWYOn

using System.Data.Sql;

using System.Data.SqlTypes;

System.Data.SqlTypes 命名空間包含能夠在程序集中使用的代表 SQL Server 本機數據類型的類。System.Data.Sql 命名空間包含將被用作 UDT 的程序集裡所必需的各種屬性所需要的對象。所有這些類型存在

copyright © 萬盛學電腦網 all rights reserved