參照:http://www.cnblogs.com/webabcd/archive/2007/06/24/793941.html
一:准備工作:
1. 首先在某數據庫(如DbTest)中創建一個表,如t1,SQL語句如下:
CREATE TABLE t1(tid int primary key, tname nvarchar(20));
2. 啟用CLR集成
在你開始用C#寫存儲過程之前,必須要啟用你的SQL Server的CLR集成特性。 默認情況它是不啟用的。代碼如下:
sp_configure 'clr enabled',1
GO
RECONFIGURE WITH OVERRIDE
GO
注:許多資料中沒加WITH OVERRIDE選項,在執行時可能會報錯:
不支持對系統目錄進行即席更新。
二:創建系統存儲過程:
1. 在VS 2010的IDE環境中新建項目:在“已安裝的模板”中依次展開Database、SQL Server,選擇“Visual C# SQL CLR Database Project”。(注意選擇.NET框架的版本,最好與要發布到的數據庫版本匹配,如SQL 2005我選擇的是.NET框架2.0)
2. 點擊確定按鈕后,系統會自動彈出“添加數據庫引用”對話框,在這里可以選擇已有的數據庫連接,或添加新的連接,將數據庫連接到DbTest中。當然也可以取消后稍候配置。
3. 在新建的項目中添加新項,選擇“Stored Procedure”,取名為sp_t1。
4. 在新打開的類文件中,頭部已經添加了一些命名空間的引用,注意最后兩個:System.Data.SqlTypes命名空間包含了很多不同的類型,它們可以用來代替SQL Server的數據類型。 Microsoft.SqlServer.Server命名空間下的類負責SQL Server的CLR集成。
5. 自動生成的靜態方法sp_t1其實就是我們要編寫的存儲過程。(注意:該方法上面已經添加了特性SqlProcedure。 在這個類中其實可以編寫許多存儲過程)
6. 修改sp_t1方法為如下代碼:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void sp_t1(SqlInt32 tid, SqlString tname)
{
// Put your code here
SqlConnection con = new SqlConnection("context connection=true");
SqlCommand com = new SqlCommand("insert into t1 values(@tid,@tname)", con);
SqlParameter par1 = new SqlParameter("@tid", tid);
SqlParameter par2 = new SqlParameter("@tname", tname);
con.Open();
com.Parameters.Add(par1);
com.Parameters.Add(par2);
int cnt = com.ExecuteNonQuery();
con.Close();
SqlContext.Pipe.Send(cnt.ToString());
}
7. 上面基本上是ADO.NET操作數據庫的代碼。但注意
(1)方法參數的數據類型SqlInt32 與SqlString,分別對應數據庫中的int與nvarchar數據庫型。
(2)連庫字符串的寫法,“上下文連接”可以讓你使用當前登錄到數據庫的用戶作為你的登錄數據庫的驗證信息。 將來存儲過程創建好后,用登錄用戶來執行此存儲過程。
(3)代碼最后一句調用了Send方法,向調用方返回信息(SQL語句影響的行數),當然如果不需要也可以不返回。
8. 編譯項目成功后再在項目的右鍵菜單中選擇“部署(deploy)”,如果出現成功的信息,表明存儲過程可以到SQL Server中使用了。
我在測試時,win7+SQL Server2005開發版沒有部署成功,但在另一台機器windows 2003+SQL Server標准版部署成功。
9. 在SQL Server Management Studio中展開DbTest數據庫的存儲過程,可以看到帶鎖標記的系統存儲過程sp_t1。
三:調試系統存儲過程
系統存儲過程與普通的存儲過程的執行沒有什么區別:exec sp_t1 1,'aa'
查詢后表t1中添加了一條記錄,並且在消息空格中返回了SQL語句影響的結果1。