拼吾爱程序人生.Net编程Asp.Net ASP.NET 2.0:AdventureWorks系统分析

1  /  1  页   1 跳转 查看:897

ASP.NET 2.0:AdventureWorks系统分析

ASP.NET 2.0:AdventureWorks系统分析

文/静水流深  出处/IT168

    AdventureWorks贸易系统是一个使用N层架构和ASP.NET 2.0技术创建的Web站点。该站点实现了贸易系统的部分功能。在实现过程中重点使用了一些集成可重用组件,这应该是大家阅读的重点所在。本系列文章包括3篇,第一篇简单介绍一下系统概况和数据库设计,第二篇讲解数据访问层的实现,第三篇说明构建Web站点的方法。通过这些内容,读者将学习和实践多方面的知识,例如N层架构应用、使用数据访问应用程序块创建数据访问层、使用泛型集合实现数据绑定、使用企业库的异常处理块统一处理异常、母版页应用等等。

1. 业务过程

    AdventureWorks贸易系统实现了贸易系统的部分功能,例如产品类别的显示等等。有关该系统的功能,读者可通过下面所描述的业务过程来了解。AdventureWorks系统的业务过程包括:

    产品类别显示过程:该过程允许用户显示AdventureWorks数据库中包括的所有类别。用户可单击所显示类别列表中的特定类别,以便显示所有相关的子类别。

    产品子类别显示过程:在获得类别列表后,接着可以显示所选中类别的所有子类别。

    产品显示过程:通过这个过程,可显示每个子类别中的产品列表。单击特定子类别可获取该产品子类别包括的产品列表。

  正如读者看到的,这些过程非常简单,因为本实例主要关注的是集成可重用组件,例如数据访问块,异常管理块,将数据库表转换为对象的泛型转换,创建和利用存储过程等。下面介绍一下系统架构方面的内容。

2. 系统架构

  图1说明了贸易系统的架构。

 附件: 您所在的用户组无法下载或查看附件

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Asp.Net] 的这些文章也感兴趣:

用Adodb.Stream直接下载文件
合并DataGrid表头,Merging DataGrid Header Columns
利用HtmlInputHidden控件实现无刷新用户注册验证
在SQLServer中保存和输出任意类型的文件
ASP.NET如何操作文件
Attribute在.net编程中的应用(三)
在DataGrid中创建一个弹出式窗口
asp.net中将Excel文件(.xls)绑定到DataGrid
ASP.NET 3.5 Extensions新特性:ASP.NET Dynamic Data 体验(下)
开发 .NET 下的 FTP 客户端组件
 

回复:ASP.NET 2.0:AdventureWorks系统分析

3. 数据库设计

    既然大家已经了解了包括的业务过程,那么下面将讲解实现解决方案所需的各个构造块。为达到本实例目的,实例余下部分的讨论将分为:(1)数据库设计;(2)实现CLR存储过程;(3)实现数据访问和业务逻辑组件;(4)实现Web站点。下面首先介绍数据库方面的设计。

    本实例使用的AdventureWorks数据库包括多个表,但是该实例仅使用了其中的三个表:ProductCategory、ProductSubcategory和Product。以下说明表的结构,首先是ProductCategory表。

   
 附件: 您所在的用户组无法下载或查看附件

    ProductSubcategory表定义如下。


 附件: 您所在的用户组无法下载或查看附件

    下表说明了Product表的结构。


 附件: 您所在的用户组无法下载或查看附件


    下一步是说明创建操作这些结构的存储过程。
 

回复: ASP.NET 2.0:AdventureWorks系统分析

4.实现CLR存储过程

    SQL Server 2005最优雅的功能之一是集成.NET CLR。集成CLR的SQL Server在多个重要的方面扩展了SQL Server功能。利用这种集成可创建数据库对象(例如存储过程),用户定义函数,以及使用现代面向对象语言(例如VB.NET和C#)创建触发器。为达成本实例目的,将说明使用C#创建存储过程的方法。

  首先,在Visual Studio 2005中,以Visual Studio 2005作为编程语言创建一个新的名为AdventureWorksDatabaseObjects的SQL Server项目。由于创建的是数据库项目,所以需要关联数据源与项目。在创建项目的同时,Visual Studio将要求开发人员要么选择现有数据库引用,要么添加新数据库引用。选择AdventureWorks作为数据库。一旦创建项目,则在项目菜单中选择添加存储过程选项。在添加新项对话框中,输入StoredProcedures.cs,接着单击添加按钮。在创建类之后,可根据以下内容修改类中代码。

  示例1:实现CLR存储过程

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductCategories()
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
string sqlCommand = "Select ProductCategoryID, Name, rowguid, " +
" ModifiedDate from Production.ProductCategory";
SqlCommand command = new SqlCommand(sqlCommand, connection);
SqlDataReader reader = command.ExecuteReader();
SqlContext.Pipe.Send(reader);
}
}

[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductSubcategories(int productCategoryID)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
string sqlCommand = "Select ProductSubcategoryID, ProductCategoryID, Name," + "rowguid, ModifiedDate from Production.ProductSubcategory " + "Where ProductCategoryID = " + productCategoryID;
SqlCommand command = new SqlCommand(sqlCommand, connection);
SqlDataReader reader = command.ExecuteReader();
SqlContext.Pipe.Send(reader);
}
}

[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProducts(int productSubcategoryID)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
string sqlCommand = "Select ProductID, Name, ProductNumber,MakeFlag, " + "FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint,StandardCost, " + "ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode," + "Weight,DaysToManufacture, ProductLine,Class, Style, " + "ProductSubcategoryID, ProductModelID,SellStartDate,SellEndDate," + "DiscontinuedDate, rowguid, ModifiedDate from Production.Product " + "Where ProductSubcategoryID = " + productSubcategoryID.ToString();
SqlCommand command = new SqlCommand(sqlCommand, connection);
SqlDataReader reader = command.ExecuteReader();
SqlContext.Pipe.Send(reader);
}
}
};
 

回复: 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;
RECONFIGURE WITH OVERRIDE;
GO


  虽然该实例使用Visual Studio创建受管存储过程,但是开发人员还是能够轻松使用文本编辑器(例如记事本)获得相同的结果。

    另外,可能有些读者会感到疑惑:到底何时使用T-SQL,何时使用受管代码呢?这个问题的答案很简单。受管代码比T-SQL更加适合实现复杂的执行逻辑,同时它对于完成许多复杂任务都具有广泛支持,包括字符串处理和正则表达式。T-SQL比较适合实现具有少量或者非过程性逻辑的数据访问的情况。本实例中的存储过程很简单,最好使用T-SQL编写,然而却使用了受管代码的方法,这主要是为了说明创建和使用受管存储过程的方法。

5. 小结


    本文对贸易系统的业务过程、系统架构、数据库设计和CLR存储过程的实现进行了介绍。贸易系统与其他很多实例不同的是,这个实例充分利用了集成重用块EntLib,尤其是在实现数据访问、异常处理等方面。这可能是读者应该重点学习和关注的方面。在下一篇文章中将介绍实现数据访问层的方法。
 
1  /  1  页   1 跳转

快速回复帖子

标题
禁用 URL 识别
禁用表情
禁用 Discuz!NT 代码
使用个人签名
  [完成后可按 Ctrl+Enter 无刷新发布]  

版权所有 拼吾爱程序人生    

Powered by Discuz!NT 2.1.202   Copyright © 2001-2008 Comsenz Inc. 鄂ICP备07500843号
返顶部