首先查看一下 ADO.NET 2.0 提供用來創(chuàng)建 SQL Server 服務器端對象的相關類。
11.2.1 System.Data.SqlServer 命名空間
當用 .NET 開發(fā) SQL Server 的內部對象時,最常使用的命名空間將會是存在 Sqlaccess.dll 程序文件內的 System.Data.SqlServer。若你曾經(jīng)用 ADO.NET 開發(fā)數(shù)據(jù)庫的應用程序,則部分對象是相通的。例如 SqlConnection、SqlCommand 等,微軟的開發(fā)小組盡量讓程序設計師在 SQL Server 內訪問數(shù)據(jù)與在外部訪問數(shù)據(jù)的程序編寫方式相似,而不需要熟悉兩套開發(fā)模式。以下稍微解釋這些對象:
SqlContext:SqlContext 類讓你可以取得 SQL Server 內部調用者的執(zhí)行環(huán)境(Context),主要是取得 SqlPipe 類實例,用此返回結果給前端調用該數(shù)據(jù)庫對象的應用程序,或是 SqlTriggerContext 以提供編寫觸發(fā)器(Trigger)的相關數(shù)據(jù)。SqlContext 類在讓我們所編寫的程序集與 SQL Server 進行溝通時顯得非常重要。使用該類的程序范例如程序代碼列表11-1所示:
程序代碼列表11-1 通過 SqlContext 取得用戶當前的執(zhí)行環(huán)境
Using cnn As New SqlConnection("Context Connection=true")
Using sqlCmd As New SqlCommand
'因為 Product 數(shù)據(jù)表屬于不同的 Schema,所以需要加上 Schema 名稱
cnn.Open()
sqlCmd.Connection = cnn
sqlCmd.CommandText = "SELECT ProductNumber FROM Production.Product"
Dim sqlRead As SqlDataReader = sqlCmd.ExecuteReader()
'因為是存儲過程,要通過 SqlPipe 將運行結果接回原來 SQL Server 的輸出
Dim sqlP As SqlPipe = SqlContext.Pipe
sqlP.Send(sqlRead)
End Using
End Using
程序代碼列表11-1 僅是簡單地取得 Production.Product 數(shù)據(jù)表內的 ProductNumber 字段,然后直接返回給前端。由于被調用的對象是在用戶已經(jīng)取得的連接環(huán)境內執(zhí)行,若要傳遞數(shù)據(jù)給用戶,就需要通過程序代碼列表 11-1 的方式引用 SqlContext 類的 Pipe 屬性,取得 SqlPipe 對象實例后,再通過 Send 方法將結果返回。
SqlConnection:讓我們所編寫的程序取得對程序集實例被 SQL Server 外部的前端應用程序調用時,該應用程序所在的數(shù)據(jù)庫連接相關設置。這些連接設置并不是由我們用 .NET 所編寫的存儲過程或用戶自定義函數(shù)的對象決定的,被調用的數(shù)據(jù)庫內部對象需要與外部應用程序使用相同的連接環(huán)境。可以用以下的程序通過連接字符串設置如下,而通過這條連接再執(zhí)行其他的 SQL 語法:
Using cnn As New SqlConnection("Context Connection=true")
SqlCommand:讓你傳送 T-SQL 命令到數(shù)據(jù)庫服務器,參照前述程序代碼列表 11-1 的范例,可以依照一般方式創(chuàng)建 SqlCommand 對象實例,并通過 SqlConnection 實例來執(zhí)行取得產(chǎn)品編號的 T-SQL 語法。
SqlParameter:用以設置與訪問 SqlCommand 對象內傳遞的參數(shù)。范例程序如程序代碼列表11-2所示:
程序代碼列表 11-2 通過 SqlCommand 和 SqlParameter 對象搭配SHA1 哈希算法為密碼編碼
_
Public Shared Sub WriteHashedPassword(ByVal UserName As String, ByVal Password As String)
'將賬號/密碼經(jīng)過 Sha1 Hash 口算法換算后,再存入數(shù)據(jù)表
Try
Using cnn As New SqlConnection("Context Connection=true")
cnn.Open()
Using sqlCmd As New SqlCommand
Dim sh1 As New SHA1Managed
Dim uEncode As New UnicodeEncoding
'將密碼以 SHA1 計算哈希值,再以 Base64 編碼。
Dim txtBytes As Byte() = uEncode.GetBytes(Password)
Dim hashedPassword As Byte() = sh1.ComputeHash(txtBytes)
Dim strHash As String = Convert.ToBase64String(hashedPassword)
Dim dml As String = "INSERT NamePass VALUES(@UserName,@HashAsString)"
With sqlCmd
.Connection = cnn
.CommandText = dml
'通過 SqlParameter 對象設置 SqlCommand 對象所包含 T-SQL 語法
'需要的參數(shù)
.Parameters.Add(New SqlParameter("@UserName", SqlDbType.NVarChar, 50))
.Parameters(0).Value = UserName
.Parameters.Add(New SqlParameter("@HashAsString", SqlDbType.NVarChar, 100))
.Parameters(1).Value = strHash
sqlCmd.ExecuteNonQuery()
End With
End Using
cnn.Close()
End Using
Catch ex As Exception
Dim fs As New FileStream("C:\YukonCLR.log", FileMode.OpenOrCreate, FileAccess.Write)
Dim sw As New StreamWriter(fs)
sw.WriteLine(ex.ToString())
sw.Close()
End Try
End Sub
常常有朋友詢問如何將用戶輸入的密碼通過哈希(Hash)算法計算過后再放入數(shù)據(jù)庫中,在以往筆者只能建議在應用程序端編寫,現(xiàn)在相同的語法可以寫成存儲過程保存在 SQL Server 內,如程序代碼列表11-2 所示。而一般的用戶只需要簡單地調用存儲過程,就可以將密碼通過 .NET Framework 提供的 SHA1 哈希算法編碼后,再存入到數(shù)據(jù)表。
SqlPipe:將執(zhí)行結果或信息送回前端應用程序,程序范例可以參照程序代碼列表 11-1 最后兩行。如果前端是通過 ADO 或 ADO.NET 對象訪問 SQL Server,而我們編寫的對象返回文字信息,則會被前端視為 Connection 對象的 InfoMessage 事件,范例如下。你也可以返回單一條記錄或是整個數(shù)據(jù)集合。
Dim pipe As SqlPipe = SqlContext.Pipe
‘傳送信息
pipe.Send(“完成事務”)
SqlDataReader:通過 SQL Server 提供的只能向前移動(forward-only)、只讀(read-only)游標(Cursor)來訪問數(shù)據(jù)。
Dim sdr As SqlDataReader = cmd.ExecuteReader()
While sdr.Read()
Debug.WriteLine(sdr("EmployeeID") & "-" & sdr(1))
End While
sdr.Close()
上述范例程序中通過 Read 函數(shù)逐條讀出數(shù)據(jù),直到數(shù)據(jù)記錄讀取完畢,Read 函數(shù)會返回 false,我們據(jù)此退出循環(huán)。
System.Transactions.Transaction:.NET Framework2.0新增了 System.Transactions 命名空間,在其內可提供新的事務管理架構與功能。若只就此處的 SQL Server 內部對象而言,你不太需要管理,因為當通過 SqlConnection 取得對象執(zhí)行環(huán)境的連接時,若該連接已經(jīng)有事務,則會自動加入,你可以通過 Transaction 的靜態(tài)屬性 Current 取得當前的事務狀況,以此完成或恢復事務。范例程序如下:
Catch ex As Exception
Transaction.Current.Rollback
約略看完 ADO.NET 2.0 與創(chuàng)建 SQL Server 2005 對象相關的類后,我們接著來看一下,如何通過 Visual Studio 2005 建構對象。
11.2.2 通過Visual Studio 2005創(chuàng)建供SQL Server 2005用的Assembly
首先在 Visual Studio 2005 新建一個新的項目,類型為“SQL Server Project”,
由于需要 Visual Studio 2005 集成開發(fā)環(huán)境幫我們部署已開發(fā)好的數(shù)據(jù)庫對象到 SQL Server 2005 實例的數(shù)據(jù)庫內,所以相關的連接設置必須正確。若在圖11-3 設置錯誤,可以在進入項目后,在“解決方案資源管理器”窗口內以鼠標右鍵點選項目名稱,通過快捷選項“屬性(Properties)”,或是鼠標雙擊項目下的“My Project”節(jié)點,另外,Visual Basic.NET 默認的根命名空間(Root Namespace)和程序集名稱(Assembly Name)將會與項目名稱相同,在部署程序集到 SQL Server 2005 時將會用到這兩個名稱。若你想更改根命名空間或程序集名稱可以進入“應用程序(Application)”頁簽修改
接著在Visual Studio 2005的項目內選取工具選單上的“項目”-“添加新項目”,打開如圖11-6的對話框,在對話框內選擇“Stored Procedure”項目,或于“解決方案資源管理器”內使用快捷選項,選擇“新建項目(New Item)”亦可。
在圖11-6 中填入適當名稱后,點選“添加(Add)”按鈕,以添加定義“Stored Procedure”的模板。
在此,我們創(chuàng)建一個存儲過程,內容如上文程序代碼列表 11-2 的定義。
在各對象前可以加上 System.Data.Sql 命名空間下所提供的一組 Attribute 來告知該函數(shù)的用途,同時可以通過該 Attribute 的 name 屬性(Property)來告知該函數(shù)或類型創(chuàng)建到 SQL Server 內對象的命名。通常若不指定名稱,就沿用原 .NET 函數(shù)的名稱當作數(shù)據(jù)庫對象的名稱。
Attribute 設置的范例如下:
編譯無誤后,接著通過 Visual Studio 2005 提供的“部署(Deploy)”功能,將你所寫好的程序部署到SQL Server 2005,
部署完你的程序對象后,打開SQL Server Management Studio,在“對象資源管理器”窗口選擇剛剛 Visual Studio 2005 所連接的數(shù)據(jù)庫AdventureWorks,你可發(fā)現(xiàn)在“程序集(Assemblies)”這個目錄底下多了一個節(jié)點YukonCLR。
“可編程性(Programmability)”-“存儲過程(Stored Procedures)”節(jié)點下,同時可以看到 Visual Studio 2005 遵循我們通過 SqlProcedure Attribute 告知的屬性,將該 WriteHashedPassword 函數(shù)注冊成存儲過程。11.2.3 通過T-SQL手動將該程序集放入到SQL Server
通過 T-SQL 語法亦可將該程序集放入到 SQL Server 2005,這時可以使用 SQL Server Management Studio 操作畫面,通過主菜單“文件”-“新建”-“項目”選項打開一個新的項目后,類型為“SQL Server 腳本”,在下方的“名稱”字段定義項目名稱后,通過“瀏覽”選擇項目存放的文件路徑。
進入SQL Server Management Studio后,在“解決方案資源管理器”窗口內的方案上點選右鍵新建項目,新建一個空的 T-SQL 查詢文件,如圖11-10所示:
你也可以通過主菜單“視圖”-“模板資源管理器”選項,從“模板資源管理器”中選擇想要完成的工作,讓你不至于從完全空白的環(huán)境開始編寫 T-SQL。圖11-11為 SQL Server Management Studio 的T-SQL 編寫環(huán)境,我們可以手動將該組件注冊到 SQL Server 2005,部署的 T-SQL 范例程序代碼將在下一節(jié)介紹。
11.2.4 調試
在任何平臺與開發(fā)環(huán)境中,調試都是必要的一環(huán)。而 Visual Studio 2005 與 SQL Server 2005 也提供了集成的調試環(huán)境。不管你是通過 Tabular Data Stream(TDS)或是 HTTP/SOAP 協(xié)議與 SQL Server 2005 溝通,還是通過 T-SQL 或 .NET 程序語言調用 SQL Server 2005 的對象,都可以直接進入集成的調試環(huán)境。
在新建“SQL Server Project”項目時,Visual Studio 2005 會自動在項目之下創(chuàng)建一個 TestScripts 子目錄,其內放置 Test.sql 文件,你可以在該文件中編寫 T-SQL 語法,調用先前用 .NET 寫成的 SQL 對象,以此啟動調試的機制。
Test.sql 文件內已經(jīng)預先提供了調用各種 SQL Server 對象的語法范例,你可以將批注去除掉,修改成調用你先前編寫的對象。接著在需要調試的 .NET 程序代碼上設置斷點,通過主菜單“調試”-“開始調試”選項或 F5 快捷鍵就可以開始調試。這時 Visual Studio 2005 會自動附加調試環(huán)境到 SQL Server 應用程序(sqlserver.exe),并幫你執(zhí)行 Test.sql 內的 T-SQL 語法,以打開該 .NET 所編寫的對象,當執(zhí)行到斷點所在的程序代碼時,就進入到單步調試的模式。
若上述步驟有問題,你仍可以通過 Visual Studio 2005 主菜單“調試”-“附加到進程(Attach to Process)”選項打開
通過在 SqlServer 內執(zhí)行我們自行編寫的 .NET 對象,進入到單步調試的環(huán)境
附加完 SqlServer.exe 程序后,再通過“SQL Server Management Studio”執(zhí)行 T-SQL 對該 .NET 對象的調用,依然可以執(zhí)行到程序代碼斷點的位置,進入單步調試的模式。
集成開發(fā)環(huán)境就介紹到此,我們接著來看通過 .NET 程序語言如何建立 SQL Server 內的五種數(shù)據(jù)庫對象。
11.2.1 System.Data.SqlServer 命名空間
當用 .NET 開發(fā) SQL Server 的內部對象時,最常使用的命名空間將會是存在 Sqlaccess.dll 程序文件內的 System.Data.SqlServer。若你曾經(jīng)用 ADO.NET 開發(fā)數(shù)據(jù)庫的應用程序,則部分對象是相通的。例如 SqlConnection、SqlCommand 等,微軟的開發(fā)小組盡量讓程序設計師在 SQL Server 內訪問數(shù)據(jù)與在外部訪問數(shù)據(jù)的程序編寫方式相似,而不需要熟悉兩套開發(fā)模式。以下稍微解釋這些對象:
SqlContext:SqlContext 類讓你可以取得 SQL Server 內部調用者的執(zhí)行環(huán)境(Context),主要是取得 SqlPipe 類實例,用此返回結果給前端調用該數(shù)據(jù)庫對象的應用程序,或是 SqlTriggerContext 以提供編寫觸發(fā)器(Trigger)的相關數(shù)據(jù)。SqlContext 類在讓我們所編寫的程序集與 SQL Server 進行溝通時顯得非常重要。使用該類的程序范例如程序代碼列表11-1所示:
程序代碼列表11-1 通過 SqlContext 取得用戶當前的執(zhí)行環(huán)境
Using cnn As New SqlConnection("Context Connection=true")
Using sqlCmd As New SqlCommand
'因為 Product 數(shù)據(jù)表屬于不同的 Schema,所以需要加上 Schema 名稱
cnn.Open()
sqlCmd.Connection = cnn
sqlCmd.CommandText = "SELECT ProductNumber FROM Production.Product"
Dim sqlRead As SqlDataReader = sqlCmd.ExecuteReader()
'因為是存儲過程,要通過 SqlPipe 將運行結果接回原來 SQL Server 的輸出
Dim sqlP As SqlPipe = SqlContext.Pipe
sqlP.Send(sqlRead)
End Using
End Using
程序代碼列表11-1 僅是簡單地取得 Production.Product 數(shù)據(jù)表內的 ProductNumber 字段,然后直接返回給前端。由于被調用的對象是在用戶已經(jīng)取得的連接環(huán)境內執(zhí)行,若要傳遞數(shù)據(jù)給用戶,就需要通過程序代碼列表 11-1 的方式引用 SqlContext 類的 Pipe 屬性,取得 SqlPipe 對象實例后,再通過 Send 方法將結果返回。
SqlConnection:讓我們所編寫的程序取得對程序集實例被 SQL Server 外部的前端應用程序調用時,該應用程序所在的數(shù)據(jù)庫連接相關設置。這些連接設置并不是由我們用 .NET 所編寫的存儲過程或用戶自定義函數(shù)的對象決定的,被調用的數(shù)據(jù)庫內部對象需要與外部應用程序使用相同的連接環(huán)境。可以用以下的程序通過連接字符串設置如下,而通過這條連接再執(zhí)行其他的 SQL 語法:
Using cnn As New SqlConnection("Context Connection=true")
SqlCommand:讓你傳送 T-SQL 命令到數(shù)據(jù)庫服務器,參照前述程序代碼列表 11-1 的范例,可以依照一般方式創(chuàng)建 SqlCommand 對象實例,并通過 SqlConnection 實例來執(zhí)行取得產(chǎn)品編號的 T-SQL 語法。
SqlParameter:用以設置與訪問 SqlCommand 對象內傳遞的參數(shù)。范例程序如程序代碼列表11-2所示:
程序代碼列表 11-2 通過 SqlCommand 和 SqlParameter 對象搭配SHA1 哈希算法為密碼編碼
Public Shared Sub WriteHashedPassword(ByVal UserName As String, ByVal Password As String)
'將賬號/密碼經(jīng)過 Sha1 Hash 口算法換算后,再存入數(shù)據(jù)表
Try
Using cnn As New SqlConnection("Context Connection=true")
cnn.Open()
Using sqlCmd As New SqlCommand
Dim sh1 As New SHA1Managed
Dim uEncode As New UnicodeEncoding
'將密碼以 SHA1 計算哈希值,再以 Base64 編碼。
Dim txtBytes As Byte() = uEncode.GetBytes(Password)
Dim hashedPassword As Byte() = sh1.ComputeHash(txtBytes)
Dim strHash As String = Convert.ToBase64String(hashedPassword)
Dim dml As String = "INSERT NamePass VALUES(@UserName,@HashAsString)"
With sqlCmd
.Connection = cnn
.CommandText = dml
'通過 SqlParameter 對象設置 SqlCommand 對象所包含 T-SQL 語法
'需要的參數(shù)
.Parameters.Add(New SqlParameter("@UserName", SqlDbType.NVarChar, 50))
.Parameters(0).Value = UserName
.Parameters.Add(New SqlParameter("@HashAsString", SqlDbType.NVarChar, 100))
.Parameters(1).Value = strHash
sqlCmd.ExecuteNonQuery()
End With
End Using
cnn.Close()
End Using
Catch ex As Exception
Dim fs As New FileStream("C:\YukonCLR.log", FileMode.OpenOrCreate, FileAccess.Write)
Dim sw As New StreamWriter(fs)
sw.WriteLine(ex.ToString())
sw.Close()
End Try
End Sub
常常有朋友詢問如何將用戶輸入的密碼通過哈希(Hash)算法計算過后再放入數(shù)據(jù)庫中,在以往筆者只能建議在應用程序端編寫,現(xiàn)在相同的語法可以寫成存儲過程保存在 SQL Server 內,如程序代碼列表11-2 所示。而一般的用戶只需要簡單地調用存儲過程,就可以將密碼通過 .NET Framework 提供的 SHA1 哈希算法編碼后,再存入到數(shù)據(jù)表。
SqlPipe:將執(zhí)行結果或信息送回前端應用程序,程序范例可以參照程序代碼列表 11-1 最后兩行。如果前端是通過 ADO 或 ADO.NET 對象訪問 SQL Server,而我們編寫的對象返回文字信息,則會被前端視為 Connection 對象的 InfoMessage 事件,范例如下。你也可以返回單一條記錄或是整個數(shù)據(jù)集合。
Dim pipe As SqlPipe = SqlContext.Pipe
‘傳送信息
pipe.Send(“完成事務”)
SqlDataReader:通過 SQL Server 提供的只能向前移動(forward-only)、只讀(read-only)游標(Cursor)來訪問數(shù)據(jù)。
Dim sdr As SqlDataReader = cmd.ExecuteReader()
While sdr.Read()
Debug.WriteLine(sdr("EmployeeID") & "-" & sdr(1))
End While
sdr.Close()
上述范例程序中通過 Read 函數(shù)逐條讀出數(shù)據(jù),直到數(shù)據(jù)記錄讀取完畢,Read 函數(shù)會返回 false,我們據(jù)此退出循環(huán)。
System.Transactions.Transaction:.NET Framework2.0新增了 System.Transactions 命名空間,在其內可提供新的事務管理架構與功能。若只就此處的 SQL Server 內部對象而言,你不太需要管理,因為當通過 SqlConnection 取得對象執(zhí)行環(huán)境的連接時,若該連接已經(jīng)有事務,則會自動加入,你可以通過 Transaction 的靜態(tài)屬性 Current 取得當前的事務狀況,以此完成或恢復事務。范例程序如下:
Catch ex As Exception
Transaction.Current.Rollback
約略看完 ADO.NET 2.0 與創(chuàng)建 SQL Server 2005 對象相關的類后,我們接著來看一下,如何通過 Visual Studio 2005 建構對象。
11.2.2 通過Visual Studio 2005創(chuàng)建供SQL Server 2005用的Assembly
首先在 Visual Studio 2005 新建一個新的項目,類型為“SQL Server Project”,
由于需要 Visual Studio 2005 集成開發(fā)環(huán)境幫我們部署已開發(fā)好的數(shù)據(jù)庫對象到 SQL Server 2005 實例的數(shù)據(jù)庫內,所以相關的連接設置必須正確。若在圖11-3 設置錯誤,可以在進入項目后,在“解決方案資源管理器”窗口內以鼠標右鍵點選項目名稱,通過快捷選項“屬性(Properties)”,或是鼠標雙擊項目下的“My Project”節(jié)點,另外,Visual Basic.NET 默認的根命名空間(Root Namespace)和程序集名稱(Assembly Name)將會與項目名稱相同,在部署程序集到 SQL Server 2005 時將會用到這兩個名稱。若你想更改根命名空間或程序集名稱可以進入“應用程序(Application)”頁簽修改
接著在Visual Studio 2005的項目內選取工具選單上的“項目”-“添加新項目”,打開如圖11-6的對話框,在對話框內選擇“Stored Procedure”項目,或于“解決方案資源管理器”內使用快捷選項,選擇“新建項目(New Item)”亦可。
在圖11-6 中填入適當名稱后,點選“添加(Add)”按鈕,以添加定義“Stored Procedure”的模板。
在此,我們創(chuàng)建一個存儲過程,內容如上文程序代碼列表 11-2 的定義。
在各對象前可以加上 System.Data.Sql 命名空間下所提供的一組 Attribute 來告知該函數(shù)的用途,同時可以通過該 Attribute 的 name 屬性(Property)來告知該函數(shù)或類型創(chuàng)建到 SQL Server 內對象的命名。通常若不指定名稱,就沿用原 .NET 函數(shù)的名稱當作數(shù)據(jù)庫對象的名稱。
Attribute 設置的范例如下:
編譯無誤后,接著通過 Visual Studio 2005 提供的“部署(Deploy)”功能,將你所寫好的程序部署到SQL Server 2005,
部署完你的程序對象后,打開SQL Server Management Studio,在“對象資源管理器”窗口選擇剛剛 Visual Studio 2005 所連接的數(shù)據(jù)庫AdventureWorks,你可發(fā)現(xiàn)在“程序集(Assemblies)”這個目錄底下多了一個節(jié)點YukonCLR。
“可編程性(Programmability)”-“存儲過程(Stored Procedures)”節(jié)點下,同時可以看到 Visual Studio 2005 遵循我們通過 SqlProcedure Attribute 告知的屬性,將該 WriteHashedPassword 函數(shù)注冊成存儲過程。11.2.3 通過T-SQL手動將該程序集放入到SQL Server
通過 T-SQL 語法亦可將該程序集放入到 SQL Server 2005,這時可以使用 SQL Server Management Studio 操作畫面,通過主菜單“文件”-“新建”-“項目”選項打開一個新的項目后,類型為“SQL Server 腳本”,在下方的“名稱”字段定義項目名稱后,通過“瀏覽”選擇項目存放的文件路徑。
進入SQL Server Management Studio后,在“解決方案資源管理器”窗口內的方案上點選右鍵新建項目,新建一個空的 T-SQL 查詢文件,如圖11-10所示:
你也可以通過主菜單“視圖”-“模板資源管理器”選項,從“模板資源管理器”中選擇想要完成的工作,讓你不至于從完全空白的環(huán)境開始編寫 T-SQL。圖11-11為 SQL Server Management Studio 的T-SQL 編寫環(huán)境,我們可以手動將該組件注冊到 SQL Server 2005,部署的 T-SQL 范例程序代碼將在下一節(jié)介紹。
11.2.4 調試
在任何平臺與開發(fā)環(huán)境中,調試都是必要的一環(huán)。而 Visual Studio 2005 與 SQL Server 2005 也提供了集成的調試環(huán)境。不管你是通過 Tabular Data Stream(TDS)或是 HTTP/SOAP 協(xié)議與 SQL Server 2005 溝通,還是通過 T-SQL 或 .NET 程序語言調用 SQL Server 2005 的對象,都可以直接進入集成的調試環(huán)境。
在新建“SQL Server Project”項目時,Visual Studio 2005 會自動在項目之下創(chuàng)建一個 TestScripts 子目錄,其內放置 Test.sql 文件,你可以在該文件中編寫 T-SQL 語法,調用先前用 .NET 寫成的 SQL 對象,以此啟動調試的機制。
Test.sql 文件內已經(jīng)預先提供了調用各種 SQL Server 對象的語法范例,你可以將批注去除掉,修改成調用你先前編寫的對象。接著在需要調試的 .NET 程序代碼上設置斷點,通過主菜單“調試”-“開始調試”選項或 F5 快捷鍵就可以開始調試。這時 Visual Studio 2005 會自動附加調試環(huán)境到 SQL Server 應用程序(sqlserver.exe),并幫你執(zhí)行 Test.sql 內的 T-SQL 語法,以打開該 .NET 所編寫的對象,當執(zhí)行到斷點所在的程序代碼時,就進入到單步調試的模式。
若上述步驟有問題,你仍可以通過 Visual Studio 2005 主菜單“調試”-“附加到進程(Attach to Process)”選項打開
通過在 SqlServer 內執(zhí)行我們自行編寫的 .NET 對象,進入到單步調試的環(huán)境
附加完 SqlServer.exe 程序后,再通過“SQL Server Management Studio”執(zhí)行 T-SQL 對該 .NET 對象的調用,依然可以執(zhí)行到程序代碼斷點的位置,進入單步調試的模式。
集成開發(fā)環(huán)境就介紹到此,我們接著來看通過 .NET 程序語言如何建立 SQL Server 內的五種數(shù)據(jù)庫對象。

