ASP.NET 2.0:AdventureWorks贸易系统分析
在示例1中,首先导入所需命名空间,接着声明StoreProcedures类。导入的重要命名空间之一是Microsoft.SqlServer.Server,该命名空间包括两个针对内部过程提供程序的重要类:
SqlContext:该类封装了为在SQL Server 2005中执行内部过程所需的扩展对象。另外,该类还提供了事务和数据库连接,它们是常规执行环境中的一部分。
SqlPipe:该类通常可将表格式结果和消息发送给客户端。就概念而言,该类与ASP.NET中的Response类相似,因此可用于将消息发送给调用者。
StoredProcedures类包括三个静态方法GetProductCategories(),GetProductSubcategories()和GetProducts()。正如名称暗示,GetProductCategories()方法仅从AdventureWorks数据库中返回所有类别信息。GetProductSubcategories()方法可返回输入特定类别的子类别信息。GetProducts()方法可返回输入特定产品子类别的所有产品信息。以下内容将详细讲解GetProductCategories()方法。
在GetProductCategories()方法内部,首先使用SqlConnection对象数据库连接。注意,传递给SqlConnection对象构造函数的连接字符串设置为“context connection=true”,这意味着使用登录用户的上下文打开数据库连接:
using (SqlConnection connection = new SqlConnection("context connection=true"))
此时,使用Open()方法打开数据库连接:connection.Open();然后,设置将要执行的SQL命令。在这种情况下,从ProductCategory表中获取所有记录:
string sqlCommand = "Select ProductCategoryID, Name, rowguid, ModifiedDate from " + "Production.ProductCategory";接着,将SQL查询语句和SqlConnection对象作为参数传递给SqlCommand类的构造函数,以便创建SqlCommand对象实例,
SqlCommand command = new SqlCommand(sqlCommand, connection);此后,通过调用SqlCommand对象的ExecuteReader()方法执行SQL查询:
SqlDataReader reader = command.ExecuteReader();使用SqlPipe对象将表格式结果和消息返回给客户端。这是通过SqlPipe类的Send()方法来实现:
SqlContext.Pipe.Send(reader);Send()方法提供了多种重载,以便通过管道将数据发送给调用方应用程序。
StoredProcedures类中所有方法都使用Send()方法来将表格式结果以SqlDataReader对象格式发送给客户应用程序。由于GetProductSubcategories()和GetProducts()与GetProductCategories()方法的实现非常相似,因此不会对前二者进行详细讲解。
既然创建了存储过程,那么就可以非常简单和直接的应用它们了。在应用之前,需要首先生成项目。为了生成项目,可在Visual Studio 2005的菜单中选择生成→生成AdventureWorksDatabaseObjects。如果出现编译错误,则将显示在错误列表面板中。一旦生成项目,那么就能够通过选择菜单中的生成→部署AdventureWorksDatabaseObjects项来将其部署到SQL Server中。这样不仅在SQL Server中注册了程序集,而且还在SQL Server中部署了存储过程。当存储过程部署到SQL Server后,接着可以在数据访问层调用它,这些内容将在下一节讲解。
在执行存储过程之前,记住使用SQL Server Management Studio执行以下代码,以便在SQL Server中执行受管代码:
EXEC sp_configure 'clr enabled', 1;虽然该实例使用Visual Studio创建受管存储过程,但是开发人员还是能够轻松使用文本编辑器(例如记事本)获得相同的结果。
RECONFIGURE WITH OVERRIDE;
GO
另外,可能有些读者会感到疑惑:到底何时使用T-SQL,何时使用受管代码呢?这个问题的答案很简单。受管代码比T-SQL更加适合实现复杂的执行逻辑,同时它对于完成许多复杂任务都具有广泛支持,包括字符串处理和正则表达式。T-SQL比较适合实现具有少量或者非过程性逻辑的数据访问的情况。本实例中的存储过程很简单,最好使用T-SQL编写,然而却使用了受管代码的方法,这主要是为了说明创建和使用受管存储过程的方法。
5. 小结
本文对贸易系统的业务过程、系统架构、数据库设计和CLR存储过程的实现进行了介绍。贸易系统与其他很多实例不同的是,这个实例充分利用了集成重用块EntLib,尤其是在实现数据访问、异常处理等方面。这可能是读者应该重点学习和关注的方面。在下一篇文章中将介绍实现数据访问层的方法。
0
相关文章