演练:使用托管代码创建存储过程
更新:2007 年 11 月
现在,可以使用 .NET Framework 语言(如 Visual Basic、C# 和 C++)在托管代码中编写 SQL Server 2005 数据库的存储过程。使用托管代码编写的存储过程称为 CLR 存储过程。
通过将“存储过程”项添加到 SQL Server 项目,可以创建 SQL 存储过程。成功部署到 SQL Server 之后,可通过与任何其他存储过程相同的方式调用和执行在托管代码中创建的存储过程。
本演练阐释以下任务:
创建新的“Windows 应用程序”项目。
在托管代码中创建存储过程。
将此存储过程部署到 SQL Server 2005 数据库。
创建在数据库上测试存储过程的脚本。
查询数据库中的数据,以确认存储过程是否执行正确。
先决条件
若要完成本演练,您需要:
- 到运行在 SQL Server 2005 之上的 AdventureWorks 示例数据库的连接。有关更多信息,请参见 如何:安装示例数据库。
创建项目
创建新的 SQL Server 项目
从“文件”菜单创建一个新的项目。
选择“SQL Server 项目”,将项目命名为 SQLCLRStoredProcedure 并单击“确定”。有关更多信息,请参见如何:创建 SQL Server 项目。
连接到 SQL Server 2005 数据库
本演练需要到运行在 SQL Server 2005 上的 AdventureWorks 示例数据库的连接。如果到 AdventureWorks 示例数据库的连接在“服务器资源管理器”中可用,则该连接会在 “添加数据库引用”对话框 中列出。
说明: |
---|
默认情况下,公共语言运行时 (CLR) 集成功能在 Microsoft SQL Server 中处于关闭状态。若要使用 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”。有关创建测试脚本的更多信息,请参见如何:编辑 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 生成、部署并调试该存储过程。有关不进行调试直接部署的信息,请参见如何:将 SQL Server 项目项部署到 SQL Server 中。
查看“输出”窗口中显示的结果,然后选择“显示以下输出: 数据库输出”。
请参见
任务
如何:创建和运行 CLR SQL Server 用户定义的函数
如何:创建和运行 CLR SQL Server 用户定义的类型