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