探討SQL Server 2005.NET CLR編程

來源:互聯網
上載者:User

本文將解釋如何在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執行該函數,你應該能夠觀察到相應的結果。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.