本文將解釋如何在SQL Server 2005中以儘可能最簡單的方法建立基於.NET的CLR子常式。本文主要針對在伺服器端使用SQL Server 2005的.NET開發人員。
一、建立SQL Server 2005資料庫
這一節主要討論建立一個將用於本文中的資料庫和表格。詳見下列步驟:
· 執行"Start->Programs->Microsoft SQL Server 2005->SQL Server Management Studio",並使用必要的認證串連到你的SQL Server 2005執行個體。
· 一旦建立串連,使用"Object Explorer"開啟SQL Server 2005執行個體,然後右擊"databases"並選擇"New Database"(圖1)。
圖1
然後,出現一個"New Database"對話方塊。輸入資料庫名"Sample"並點擊"OK"以便在同一個執行個體內建立新的資料庫。
· 一旦建立該資料庫,你一定能夠在"Object explorer"中看到相同的結果。
· 使用"Object explorer"開啟"Sample"資料庫,右擊"tables"並選擇"new table"(圖2)。
圖2
· 建立如下圖3所示的表格結構,並用"emp"儲存表格。
圖3
· 一旦你建立了表格"emp",開啟它(圖4)並使用下列資料進行填充(圖5)。
圖4
圖5
二、建立SQL Server 2005資料庫.NET CLR預存程序
一旦你建立完資料庫和表格,接下來讓我們使用下列步驟在SQL Server 2005資料庫中建立一個.NET CLR預存程序:
· 轉到"Start -> Programs -> Microsoft Visual Studio 2005 -> Microsoft Visual Studio 2005"。
· 在"New Project"對話方塊內,從"Visual Basic"樹的"Project Type"下選擇"database"並選擇"SQL Server Project"作為模板,輸入名字"SampleAllInOne"。至此,該對話方塊應該看起來如下圖6所示。
圖6
· 一旦你點擊"OK",將出現一個"New Database Reference"對話方塊。輸入你自己的執行個體名,並選擇資料庫"Sample"(在上一節建立的),並且測試連接(圖7)。
圖7
· 一旦測試成功,點擊"OK"建立工程。
· 然後系統出現一個對話方塊,它詢問你是否啟動CLR調試功能。請點擊"Yes"(圖8)。
圖8
· 使用"Solution explorer",右擊"SampleAllInOne"工程,並點擊"Add->Stored Procedure"(以建立一個新的預存程序)(圖9)。
圖9
· 之後,出現"Add New Item"對話方塊。在該對話方塊內,選擇"Stored Procedure"作為模板並輸入名字"IncSalaries",最後點擊"Add"(圖10)。
圖10
三、.NET CLR預存程序編碼
一旦建立"IncSalaries.VB",以下列方法修改你的代碼,如下所示:
以下為引用的內容: Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports Microsoft.SqlServer.Server Partial Public Class StoredProcedures <Microsoft.SqlServer.Server.SqlProcedure()> _ Public Shared Sub IncSalaries(ByVal IncVal As SqlDouble) '在此添加你的代碼 Using cn As New SqlConnection("context connection=true") Dim cmd As New SqlCommand("update sample.dbo.emp set sal = sal + " & IncVal.ToString, cn) cmd.Connection.Open() cmd.ExecuteNonQuery() End Using End Sub End Class |
上面是一個使用Visual Basic.NET 2005編寫簡單的基於CLR的預存程序,你可以把它發布到SQL Server 2005中。該預存程序名為"IncSalaries",它只接收一個參數-"IncVal"。上面的預存程序簡單地使用參數中提供的值來提高表格"emp"中每一位僱員的工資值。
四、.NET CLR預存程序測試
為了測試上面的預存程序,請遵循下列步驟:
· 使用"Solution Explorer"在"test scripts"中開啟"test.sql"(圖11)。
圖11
· 轉到最後一行,並如下修改代碼:
--為運行你的工程,請編輯你的工程的Test.sql檔案。
--這個檔案位於Solution Explorer的"Test Scripts"檔案夾下
exec IncSalaries 50
· 轉到"Start->Programs->Microsoft SQL Server 2005->Configuration Tools->SQL Server Surface Area Configuration"。
· 在視窗內,點擊"Surface Area Configuration for Features"(圖12)。
圖12
· 啟動CLR整合,如下所示(圖13)。
圖13
· 按F5執行整個方案。如果它的執行中出現任何錯誤,一切都會被顯示於輸出視窗中。
· 如果預存程序成功執行,你應該能夠看到所有的工資數增加了50。
五、SQL Server 2005資料庫中的.NET CLR使用者定義函數
現在,我們要在我們現有的方案上添加一個儲存函數。
· 使用"Solution explorer",右擊"SampleAllInOne"工程並轉到"Add->User-defined Function"(以建立一個新的儲存函數)(圖14)。
圖14
· 之後,出現"Add New Item"對話方塊。在對話方塊內,選擇"User defined function"作為模板,輸入名字"getNetSalary",最後點擊"Add"(圖15)。
圖15
一旦建立"getNetSalary.VB",接下來按下列方式修改你的代碼:
以下為引用的內容: Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports Microsoft.SqlServer.Server PartialPublic Class UserDefinedFunctions <Microsoft.SqlServer.Server.SqlFunction (DataAccess:=DataACCESSKind.Read)> _ Public Shared Function getNetSalary(ByVal empno As SqlString) As SqlDouble '在此添加你的代碼 Dim sal As Double Using cn As New SqlConnection("context connection=true") Dim cmd As New SqlCommand("select sal from sample.dbo.emp where empno='" & empno.ToString & "'", cn) cmd.Connection.Open() sal = CType(cmd.ExecuteScalar, Double) cmd.Dispose() End Using Dim hra As Double = sal * 10 / 100 Dim ta As Double = 200 Dim gross As Double = sal + hra + ta Dim epf As Double = sal * 5 / 100 Dim net As Double = gross - epf Return net End Function End Class |
然後,使用下列步驟測試上面的預存程序:
· 使用"Solution Explorer"在"test scripts"中開啟"test.sql"(見前圖11)。
· 轉到並修改如下代碼:
--為運行你的工程,請編輯你的工程的test.sql檔案。
--這個檔案位於Solution Explorer的"Test Scripts"檔案夾下
--exec IncSalaries 50
select dbo.getNetSalary(empno) from sample.dbo.emp
按F5執行該函數,你應該能夠看到相應結果。
六、定義.NET CLR使用者定義彙總器
現在,我們開始在上一節基礎上在我們的現有方案上添加一個彙總函式。
· 使用"Solution explorer",右擊"SampleAllInOne"工程並轉到"Add->Aggregate"(以建立一個新的彙總函式)(圖16)。
圖16
· 之後,出現"Add New Item"對話方塊。在該對話方塊內,選擇"Aggregate"作為模板,輸入名字"NetSal"並點擊"Add"(圖17)。
圖17
一旦建立"NetSal.VB",接下來以下列方式修改你的代碼:
以下為引用的內容: Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports Microsoft.SqlServer.Server <Serializable()> _ <Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)> _ PublicStructure NetSal Public SumNetSal As SqlDouble Public Sub Init() '在此加入你的代碼 SumNetSal = 0 End Sub Public Sub Accumulate(ByVal value As SqlDouble) '在此加入你的代碼 Dim sal As Double = CType(value, Double) Dim hra As Double = sal * 10 / 100 Dim ta As Double = 200 Dim gross As Double = sal + hra + ta Dim epf As Double = sal * 5 / 100 Dim net As Double = gross - epf SumNetSal += net End Sub Public Sub Merge(ByVal obj As NetSal) '在此加入你的代碼 SumNetSal += obj.SumNetSal End Sub Public Function Terminate() As SqlDouble '在此加入你的代碼 Return SumNetSal End Function EndStructure |
為了測試上面的預存程序,遵循下列步驟:
· 使用"Solution Explorer",然後在"test scripts"中開啟"test.sql"。
· 轉到最後一行並修改如下代碼:
--為運行你的工程,請編輯你的工程的test.sql檔案。
--這個檔案位於Solution Explorer的"Test Scripts"檔案夾下
--exec IncSalaries 50
--select dbo.getNetSalary(empno) from sample.dbo.emp
select dbo.NetSal(sal) from sample.dbo.emp
按F5執行該函數,你應該能夠觀察到相應的結果。