程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 通過CLR同步SQL Server和Sharepoint List數據(一)

通過CLR同步SQL Server和Sharepoint List數據(一)

編輯:關於.NET

寫在前面

本系列文章一共分為四部分:

1. CLR概述。

2. 在Visual Studio中進行CLR集成編程並部署到SQL Server,包括存儲過程 、觸發器、自定義函數、自定義類型和聚合。

3. CLR集成編程的調試和所遇到的問題。

4. 利用CLR同步SQL Server表和Sharepoint List(來源於實際項目應用)。

本系列文章建立在以下軟件環境的基礎上:

Windows Server 2003 Enterprise Edition Service Pack 2

Microsoft Visual Studio Team System 2008

Microsoft SQL Server 2008

Microsoft Office Sharepoint Server 2007

前言

CLR(Common Language Runtime)公共語言運行時是Microsoft在.NET出來之 後創造出來的一個概念,它是.NET架構中重要的組成部分,為所有.NET Framework代碼提供執行環境。在CLR中運行的代碼稱為托管代碼。CLR提供執行程 序所需的各種函數和服務,包括實時(JIT)編譯、分配和管理內存、強制類型安 全、異常處理、線程管理和安全性等。相信讀者已經在任何一本介紹.NET的書中 對它進行了了解,並且深知CLR的工作原理。本文要介紹的不僅僅是.NET架構中的 CLR,更多的則是有關CLR的集成編程。事實上,Microsoft在公共語言運行時 (CLR)集成編程上已經做了很多准備了,以至於用戶現在可以用.NET的任何一種 語言將自己編寫好的功能安插在微軟的任何一款產品上(可能有些誇張了),例 如SQL Server、Office產品等,本文正是針對CLR在SQL Server上的應用進行介紹 。有關CLR在其它產品上的應用,我將在其它系列文章中再做介紹(如VSTO等)。

從SQL Server 2005開始,Microsoft就已經在其中集成了公共語言運行時 (CLR)組件,只不過當時的應用可能還不太廣泛(也許我當時還並沒有怎麼聽說 ),使用的用戶不多。但是,這也就意味著用戶已經可以使用.NET的任何一種語 言(如VB.NET和C#.NET等)來為數據庫編寫存儲過程、觸發器、用戶定義類型、 用戶定義函數、用戶定義聚合和流式表函數等等數據庫對象了。這個消息聽起來 著實讓人很興奮,這讓那些許多年來都十分保守的DBA、DEV(數據庫開發人員) 們有了更多的選擇,同時也讓許多單純的SDE(軟件開發人員)可以嘗試數據庫開 發,從而讓程序和後台的數據庫結合得更加緊密,開發人員之間的協作更加順暢 。

公共語言運行時(CLR)集成概述

Microsoft SQL Server已經具備了與.NET Framework的公共語言運行時(CLR )組件集成的功能。CLR為托管代碼提供服務,例如跨語言集成、代碼訪問安全性 、對象生存期管理以及調試和分析支持,它具有以下一些特點:

更好的編程模型。.NET Framework語言在許多方面都比 Transact-SQL豐富, 它為SQL Server開發人員提供了以前沒有的構造和功能。開發人員還可以利用 .NET Framework 庫的功能,它提供了大量可用於快速有效地解決編程問題的類。

改進了安全和安全性。托管代碼在數據庫引擎承載的公共語言運行時環境中運 行。SQL Server利用這一特點為在 SQL Server 早期版本中提供的擴展存儲過程 提供更安全更可靠的替代方法。

能夠定義數據類型和聚合函數。 用戶定義類型和用戶定義聚合是兩個新的托 管數據庫對象,這兩個對象擴展了SQL Server的存儲和查詢功能。

通過標准化環境簡化了開發。數據庫開發集成到將來版本的Microsoft Visual Studio .NET開發環境中。開發人員在開發和調試數據庫對象和腳本時所使用的工 具與他們編寫中間層或客戶端層的 .NET Framework組件和服務時所使用的工具相 同。

具備改善性能和可擴展性的潛力。在多數情況下,.NET Framework語言編譯和 執行模型通過Transact-SQL提高性能。

托管代碼使用代碼訪問安全性(CAS)來使程序集無法執行某些操作。SQL Server使用CAS來幫助保護托管代碼,並阻止對操作系統或數據庫服務器的侵害。

CLR集成的優點

Transact-SQL是為了在數據庫中直接進行數據訪問和操縱而專門設計的。雖然 Transact-SQL在數據訪問和管理方面表現很好,但它不是完整的編程語言。例如 ,Transact-SQL不支持數組、集合、for-each循環、移位或類。雖然可以在 Transact-SQL中模擬某些這樣的構造,但托管代碼已經集成了對這些構造的支持 。根據具體情況,這些功能足以為在托管代碼中實現某些數據庫功能提供充分理 由。

選擇Transact-SQL還是托管代碼

如果代碼主要執行沒有或只有很少過程邏輯的數據訪問,請使用Transact-SQL 。如果要編寫有復雜邏輯並且CPU占用量大的函數和過程,或者想使用.NET Framework的BCL,則使用托管代碼。

選擇在服務器中執行還是在客戶端中執行

影響使用Transact-SQL還是托管代碼的另一個因素是您想將代碼駐留在服務器 計算機上,還是在客戶端計算機上。Transact-SQL和托管代碼都可以在服務器上 運行。這種方式可以將代碼和數據靠近放在一起,並允許您利用服務器的強大處 理能力。另一方面,您可能希望避免將處理器占用量大的任務放在數據庫服務器 上。目前大多數客戶端計算機都有非常強大的功能,因此您可能希望通過將盡可 能多的代碼放在客戶端上,來利用這種處理能力。托管代碼可以在客戶端計算機 上運行,而Transact-SQL不能。

選擇擴展存儲過程還是托管代碼

可以生成擴展存儲過程來執行使用Transact-SQL存儲過程無法實現的功能。但 是,擴展存儲過程可能有損於SQL Server進程的完整性,而經過驗證確定為類型 安全的托管代碼則不會。進一步來說,在CLR的托管代碼與SQL Server之間更深入 地集成了內存管理、線程及纖程的調度以及同步服務。如果所編寫的存儲過程需 要執行在Transact-SQL中不可能完成的任務,則CLR集成有比擴展存儲過程更安全 的方式來實現它。

公共語言運行時(CLR)集成性能

現在開發人員可以自由選擇Transact-SQL或者CLR進行SQL Server數據庫開發 ,但是兩者在性能方面各有優缺點,針對於不同類型的運算和數據庫對象,下表 給出了兩者之間的區別。

類型

Transact_SQL

CLR

用戶定義函數 執行數據訪問時更有效。 適用於過程代碼、計算和字符串操作以及需要大量計算和 不執行數據訪問的部分。 用戶定義聚合 非基於游標的本機內置聚合函數的性能高於CLR方式。 性能高於基於游標的聚合,但執行速度較慢。 流式表值函數(TVF函數)

托管TVF的性能優於可比擴展存儲過程實現的性能,它返回 IEnumerable接口的托管函數。 數組與游標 游標的性能低於CLR中的數組 當Transact-SQL游標必須遍歷更容易表示為數組的數據時 ,使用托管代碼可以顯著提高性能。 字符串數據 char或varchar數據類型。 托管函數中可以是SqlString或 SqlChars類型。 擴展存儲過程 無法查看或控制擴展存儲過程的資源使用情況。 可以使用托管代碼對給定的線程進行檢測。

公共語言運行時(CLR)集成安全性

與.NET Framework公共語言運行時 (CLR) 集成的SQL Server的安全模式用於 管理和保護SQL Server內運行的不同類型CLR對象和非CLR對象之間的訪問。這些 對象可能由Transact-SQL語句或服務器上運行的其他CLR對象調用。對象之間的調 用稱為鏈接。對這些對象執行的安全檢查類型取決於相關的鏈接類型。CLR集成安 全模式可實現以下目的:

默認情況下,在SQL Server中運行托管用戶代碼不應當損害SQL Server的完整 性和穩定性。如果執行有可能損害 SQL Server可靠性的操作,則應當受到適當的 高級權限的保護。

托管用戶代碼不應當獲得對數據庫中用戶數據或其他用戶代碼的未經授權訪問 。用戶定義代碼應當在調用該代碼的用戶會話的安全上下文中運行,且擁有該安 全上下文的正確特權。

應當有控制來限制用戶代碼不得訪問服務器以外的任何資源,而只能用於本地 數據訪問和計算。

用戶定義代碼不應能通過在SQL Server進程中運行而獲得對系統資源的未經授 權訪問。

SQL Server已經集成了SQL Server基於用戶的安全模式和CLR基於代碼訪問的 安全模式。SQL Server主機策略級別授予程序集的代碼訪問安全性權限集由創建 該程序集時指定的權限集決定。有三個權限集:SAFE、EXTERNAL_ACCESS和UNSAFE 。

SAFE 最具限制性的權限集,只允許內部計算和本地數據訪問,無法訪問外 部系統資源,如文件、網絡、環境變量或注冊表。並且只能使用上下文連接字符 串指定數據庫連接,即context connection=true或context connection=yes。 EXTERNAL_ACCESS 與SAFE具有相同的權限,但允許訪問外部系統資源。 UNSAFE 允許程序集不受限制地訪問SQL Server內部和外部的資源 ,此時程序集被授予FullTrust。

一般情況下,在不使用SQL Server外部系統資源時建議采用SAFE方式的程序集 ,如果在程序集中需要訪問外部系統資源,推薦使用EXTERNAL_ACCESS,而不是 UNSAFE,後者將允許程序集中的代碼對SQL Server進程空間進行非法操作,可能 會損害SQL Server的健壯性和可靠性。EXTERNAL_ACCESS程序集默認情況下將以 SQL Server的當前服務賬戶運行,它可以顯示模擬調用方的Windows身份驗證安全 上下文,這也就是我在後面使用SQL CLR連接Sharepoint List時為什麼要將程序 集設置為EXTERNAL_ACCESS!

結語

總之,公共語言運行時(CLR)為使用C# Custom程序集連接SQL Server和外部 資源(諸如Sharepoint List、網絡資源、文件系統等),以及SQL Server本身數 據運算提供了良好的基礎和更好的便利性。在下一篇文章中我將介紹如何在SQL Server 2008中開啟CLR並編寫CLR使之在SQL Server中成功運行,當中可能會遇到 很多小的問題,到時我會一一給出解決辦法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved