逐步解說:使用 Managed 程式碼建立預存程序
更新:2007 年 11 月
您現在可以使用 .NET Framework 語言,例如 Visual Basic、C# 和 C++,將 SQL Server 2005 資料庫的預存程序撰寫在 Managed 程式碼中。撰寫在 Managed 程式碼中的預存程序稱為 CLR 預存程序。
您可以將 [預存程序] 項目加入至 SQL Server 專案,以建立 SQL 預存程序。順利部署至 SQL Server 之後,便可如同其他預存程序般,呼叫和執行以 Managed 程式碼所建立的預存程序。
本逐步解說所述的工作包括下列各項:
建立新的 [Windows 應用程式] 專案。
以 Managed 程式碼建立預存程序。
將預存程序部署至 SQL Server 2005 資料庫。
建立指令碼,在資料庫上測試預存程序。
查詢資料庫中的資料,以確認預存程序正常執行。
必要條件
若要完成這個逐步解說,您必須要有:
- 連接到執行於 SQL Server 2005 的 AdventureWorks 範例資料庫;如需詳細資訊,請參閱 HOW TO:安裝範例資料庫。
建立專案
若要建立新的 SQL Server 專案
從 [檔案] 功能表中,建立新專案。
選取 [SQL Server 專案],將專案命名為 SQLCLRStoredProcedure,再按一下 [確定]。如需詳細資訊,請參閱 HOW TO:建立 SQL Server 專案。
連接到 SQL Server 2005 資料庫
此逐步解說需要連接至在 SQL Server 2005 上執行的 AdventureWorks 範例資料庫。如果 [伺服器總管] 中有 AdventureWorks 範例資料庫的連接,此連接會列在加入資料庫參考對話方塊中。
注意事項: |
---|
根據預設,Microsoft SQL Server 中的 Common Language Runtime (CLR) 整合功能已關閉。您必須啟用它,才能使用 SQL Server 專案項目。若要啟用 CLR 整合,請使用 sp_configure 預存程序的 clr enabled 選項。如需詳細資訊,請參閱啟用 CLR 整合。 |
若要連接到 AdventureWorks 範例資料庫
完成 [加入連接] 對話方塊,即可連接到 SQL Server 2005 中所包含的 AdventureWorks 範例資料庫。如需詳細資訊,請參閱新增/修改連接 (Microsoft SQL Server)。
-或-
在 [加入資料庫參考] 對話方塊中,選取現有的 AdventureWorks 範例資料庫連接。如需詳細資訊,請參閱加入資料庫參考對話方塊。
建立 SQL Server 預存程序
建立 SQL Server 專案之後,將預存程序加入此專案。
若要建立 SQL Server 預存程序
在 [專案] 功能表上,按一下 [加入新項目]。
在加入新項目對話方塊中,選取 [預存程序]。
輸入 InsertCurrency 做為新預存程序的 [名稱]。
按一下 [加入]。
以下列程式碼取代 [程式碼編輯器] 中的程式碼:
注意事項: C++ 範例必須使用 /clr:safe 編譯器選項進行編譯。
Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports Microsoft.SqlServer.Server Partial Public Class StoredProcedures <SqlProcedure()> _ Public Shared Sub InsertCurrency( _ ByVal currencyCode As SqlString, ByVal name As SqlString) Using conn As New SqlConnection("context connection=true") Dim InsertCurrencyCommand As New SqlCommand() Dim currencyCodeParam As New SqlParameter("@CurrencyCode", SqlDbType.NVarChar) Dim nameParam As New SqlParameter("@Name", SqlDbType.NVarChar) currencyCodeParam.Value = currencyCode nameParam.Value = name InsertCurrencyCommand.Parameters.Add(currencyCodeParam) InsertCurrencyCommand.Parameters.Add(nameParam) InsertCurrencyCommand.CommandText = _ "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" & _ " VALUES(@CurrencyCode, @Name, GetDate())" InsertCurrencyCommand.Connection = conn conn.Open() InsertCurrencyCommand.ExecuteNonQuery() conn.Close() End Using End Sub End Class
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [SqlProcedure()] public static void InsertCurrency_CS( SqlString currencyCode, SqlString name) { using (SqlConnection conn = new SqlConnection("context connection=true")) { SqlCommand InsertCurrencyCommand = new SqlCommand(); SqlParameter currencyCodeParam = new SqlParameter("@CurrencyCode", SqlDbType.NVarChar); SqlParameter nameParam = new SqlParameter("@Name", SqlDbType.NVarChar); currencyCodeParam.Value = currencyCode; nameParam.Value = name; InsertCurrencyCommand.Parameters.Add(currencyCodeParam); InsertCurrencyCommand.Parameters.Add(nameParam); InsertCurrencyCommand.CommandText = "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" + " VALUES(@CurrencyCode, @Name, GetDate())"; InsertCurrencyCommand.Connection = conn; conn.Open(); InsertCurrencyCommand.ExecuteNonQuery(); conn.Close(); } } }
#include "stdafx.h" #using <System.dll> #using <System.Data.dll> #using <System.Xml.dll> using namespace System; using namespace System::Data; using namespace System::Data::Sql; using namespace System::Data::SqlClient; using namespace System::Data::SqlTypes; using namespace Microsoft::SqlServer::Server; // In order to debug your Stored Procedure, add the following to your debug.sql file: // // EXEC InsertCurrency_CPP 'AAA', 'Currency Test' // SELECT * FROM Sales.Currency WHERE CurrencyCode = 'AAA' public ref class StoredProcedures { public: [SqlProcedure] static void InsertCurrency_CPP(SqlString currencyCode, SqlString name) { SqlConnection ^conn = gcnew SqlConnection("context connection=true"); SqlCommand ^insertCurrencyCommand = gcnew SqlCommand(); SqlParameter ^currencyCodeParam = gcnew SqlParameter("@CurrencyCode", SqlDbType::NVarChar); SqlParameter ^nameParam = gcnew SqlParameter("@Name", SqlDbType::NVarChar); insertCurrencyCommand->CommandText = "insert Sales.Currency(CurrencyCode, Name, ModifiedDate)" + " values(@CurrencyCode, @Name)"; insertCurrencyCommand->Connection = conn; conn->Open(); insertCurrencyCommand->ExecuteNonQuery(); conn->Close(); } };
部署、執行和偵錯預存程序
建立新的預存程序之後,按下 F5 即可進行建置、部署至 SQL Server 和偵錯等作業。首先,將執行和測試預存程序的程式碼,加入至專案中 TestScripts 資料夾的 Test.sql 檔案內。在 Visual C++ 中,這個檔案的名稱為 debug.sql。如需建立測試指令碼的詳細資訊,請參閱 HOW TO:編輯 Test.sql 指令碼以執行 SQL 物件。
如需偵錯 SQL 的詳細資訊,請參閱偵錯 SQL 資料庫物件。
若要部署及執行 InsertCurrency 預存程序
若為 Visual Basic 和 Visual C#,請在 [方案總管] 中,展開 [TestScripts] 資料夾,並按兩下 [Test.sql] 檔案。
若為 Visual C++,請在 [方案總管] 中,按兩下 [debug.sql] 檔案。
以下列程式碼取代 Test.sql (在 Visual C++ 中為 debug.sql) 檔案中的程式碼:
EXEC InsertCurrency 'AAA', 'Currency Test' SELECT * from Sales.Currency where CurrencyCode = 'AAA'
按下 F5,即可建置、部署和偵錯預存程序。如需在不偵錯的情況下進行部署的詳細資訊,請參閱 HOW TO:將 SQL Server 專案項目部署至 SQL Server。
檢視 [輸出] 視窗中的結果,並選取 [顯示輸出來源: 資料庫輸出]。
請參閱
工作
HOW TO:建立及執行 CLR SQL Server 預存程序
HOW TO:建立及執行 CLR SQL Server 觸發程序
HOW TO:建立及執行 CLR SQL Server 彙總
HOW TO:建立及執行 CLR SQL Server 使用者定義函式
HOW TO:建立及執行 CLR SQL Server 使用者定義型別