. . . . . . . . . . . . . . Blog Garden' C plus plus (My technology Impire!)

................................................................ It‘s a age of economic globalization and Infomation globalization........................................

数据访问两种模式的比较

数据访问两种模式的比较

ASP.NET2.0扩展了ASP.NET1.1里数据访问的模式,简单概括起来具有两种模式

1、使用数据源控件(SqlDataSource/ObjectDataSource)

  1)建立一个项目TwoMode

  2)建立数据库连接

   由于ASP.NET2.0提供了App_Data目录,所以你可以直接把数据库文件拷贝到该目录下,然后在“解决方案资源管理器”中,刷新该文件,就可以看到该文件了,如下图
image001.png

然后切换到“数据库视图”里,就可以看到该数据库了,如图
image002.png

不过在使用时,有时候,当你把一个新的数据库文件*.MDF拷贝到App_Code目录下展开时,会出现连接超时的现象,这是因为系统第一次访问该数据库时,除了需要验证必要的信息外,还需要生成数据库日志文件,所以,你只要再次展开数据库文件即可。

3)连接数据库
把数据源控件(为了便于说明,这里使用SqlDataSource控件)拖放到default.aspx上
image003.png


单击“智能感应”右边的Configure Data Source,出现数据库连接配置向导
image004.png

这里,系统会子定识别在App_Data目录下的数据库,如果你不把数据库放置在App_Data下,那你就自己建立连接吧


然后把数据库连接保存在web.config里

image005.png

下一步,选择数据库
image006.png


当然,你可以测试运行的结果
image007.png

接下来,把一个GridView控件放到default上,设置数据源为SqlDataSource1,就可以了
image008.bmp

你也可以利用“Auto Format”设置其样式
image009.jpg



(2)数据集和数据适配器(传统的数据访问模式)

前面介绍了使用DataSource控件访问数据库的过程,本节介绍利用数据适配集/数据适配器的访问数据库。这两种设计模式的差别,使得GridView的设计即要支持DataSource控件的数据绑定模式,还需要支持数据集和数据适配器这种数据绑定模式,由于这对峰峦冤孽的存在,才让GirdView控件的设计时较为复杂。当然天天感觉,你只要知道这两种差别并具有一些概念就可以了,也不用深究,毕竟大家不是控件开发专家。



2.4
数据集与数据适配器

VS.NET2005 支持传统的数据绑定方式,并为该方式提供了可视化操作,本级将介绍数据集和数据适配器。

2.4.1 强类型化数据集简介

对于大多数应用程序而言,不管将来应用于 Web Server 上还是 Windows Form 上,数据访问都是一个重要的环节。数据访问更倾向于处理对数据库的读写,您可以单独创建 Helper 类来处理这些共性,但是您仍然需要编写大量的代码。

事实上,我们可能有这样一种感觉:创建数据访问层很乏味,因为对于 DAL 的不同方法,执行 SQL 语句或存储过程的 ADO.NET 代码通常是相同或相似的。尽管可以使用本书前面的方法自定义 ADO.NET 代码编写自己的 DAL ,但是 Visual Studio 还是提供了一种方便的方式,可以根据简单向导的输入生成数据访问层。这种情况下的数据访问层是强类型 DataSet 对象。 DataSet 包含 TableAdapter 类型,这些类型公开用于返回强类型 DataTable 对象的方法。这些方法适合用于直接绑定到 ObjectDataSource ,也适合用于从业务逻辑层组件进行调用。

 

1 )类型化数据集

VS.NET2005 提供了数据集和数据适配器,使用它们可以大大减少代码的编写,利用 Visual Stduio.NET 设计器可以以声明的方式生成强类型化数据集。这里的数据集也是从 ADO.NET  DataSet DataTable DataRow 派生的类,该类对外界提供了安全的 API 接口。通过 API 接口使得我们可以很容易访问 DataSet 里的数据与数据模式。

可以通过在 VS.NET2005 里通过简单的拖、放操作来生成这些强类型数据集,利用属性设计器还可以建立数据访问模式。其实您的这些操作就是生成一个类型化的 XML 模式文件定义( XML Schema Definition XSD )。改 XSD 文件包含了数据库设计模式结构,系统能够根据该结构来将数据包含在 DataSet 中,换句话说, VS.NET2005 将使用该 XSD 文件来生成一个包含数据集类定义的代码文件。

     当你在应用程序里访问数据时,数据将根据数据表的不同被组织为一个个业务逻辑实体,例如 Category 实体, Product 实体等(数据适配器表),为了能够使用这些数据,您需要将这些逻辑实体转换为类的对象,所以您可以自己为每一个实体编写一个类对象。这些实体对象一般会为数据访问提供一些属性和方法,您可以在类里使用这些属性和方法以返回强类型集合

强类型化的数据集为建立和委托自定义类对象提供了方便,从本质上说您建立的类对象是一个类型化的 DataSet ,该 DataSet 包含了业务逻辑实体和一些数据集合,但是主要区别是您在以声明的方式编写模式文件,您可以利用 VS.NET2005 的支持以可视化的方式编辑,删除 XML 数据模式文件, VS.NET 能够感知模式文件的变化并更新代码文件类的成员。

另外,由于强类型化 DataSet 是从 ADO.NET 相关类派生,所以您可以重复利用 ADO.NET 提供的数据操作能够,例如数据绑定,数据分页、排序、过滤等常见的工作。

最后一点,也是最重要的一点当您在 VS.NET2005 建立数据集后,您可以为每一张表获取强类型的数据适配器表,使用该数据适配器您可以极大的减少常规代码大编写。该数据适配器进一步封装了数据的链接 Connection ,数据的执行 Command ,后面会详细介绍这些内容。

 

2 DataSets Business Objects 的比较

   一个常见的讨论是:是否在应用程序里使用 DataSets 。虽然 DataSets 确实为应用程序代码的编写提供了方便,但是由于它封装了许多实现细节,因为在理解性和可控性方面都具有一定的局限性。在这方面自定义 Business Objects 具有可度性强,理解简单的有点。但是正如前述, DataSets 可以减类似代码的重复编写。事实上,对于 Web 而言,数据的读取原比数据的写入占有重要的比例,所以在这简单的数据读取方面, DataSets 将比 Business Objects 更具有优势。    

 

2.4.2 建立数据集与数据适配器

    本书在第一章曾介绍如何利用 VS.NET2005 建立数据库,本节继续使用 Database 数据库来说明数据集和数据适配器的使用。在“ Server Explorer ”视图里,您可以看到 Database 数据库里已经有了 Categories products 两张表,如图 2-42

   image010.png
2-42 Database 数据库                 

 

1) 使用 DataSet 设计器

接下来我们将建立 Database 的业务逻辑层,在“解决方案资源管理器”里单击鼠标右键选择“ Add New Item... ”,选择“ DataSet ”并将它命名 Database.xsd 如图 2-43




VS.NET 里建立的 DataSet 将采用默认的文件命名方式。例如此处建立的文件名为 Database.xsd ,则系统以后建立的 DataSet 派生类就命名为 Database 。相反,如果您此处建立的 DataSet 命名为 MyDAL ,则以后建立的 DataSet 派生类就命名为 MyDAL 类。

接下来会弹出一个对话框,询问你是否将该文件添加到 App_Code 目录下,我们选择“ Yes ”以便后面代码共享。

注意: App_Code 文件夹除了类文件 *.cs 外, *.XSD,Web Service 等也都可以共享

此后,系统将在 App_Code 目录下建立 Database.xsd 文件并启动“ TableAdapter Configuration Wizard ”向导如图 2-44 image012.png 2-44 TableAdapter Configuration Wizard ”向导

 

2) 建立第一个数据适配器

     在图 2-44 里,单击 Next ,系统会询问你是否使用 DatabaseConnectionString 作为连接字符串并保存在 web.config 里,选中“ Yes ”复选框如
image013.jpg

 
引入下一步,选择 SQL 语句的命令类型,可以是 SQL 语句,也可以新建存储过程或者是已经存在的存储过程。在这里我们使用第一项“ Use SQL statements ”,如图 2-26

image014.png
2-46 使用 SQL 语句

 

在下一步里,我们使用“ Query Builder ”来建立 SQL 语句,如图 2-47 ,你可以单击“ Execute Query ”来查看该 SQL 语句执行的结果。   image015.png
2-47 Query Builder 查询器

 

当返回后将自生成如下的 SQL 语句,参考图 2-48

SELECT     ProductID, ProductName, CategoryID, Price, InStore, Description

FROM         Products

                        2-48 生成 SQL 语句

image016.png  

在图 2-48 里还有一个“ Advanced Options... ”(高级选项),单击后将弹出高级选项对话框,如图 2-49


image017.png
2-49 高级对话框

在高级选项里,默认是选中“ Generate Insert Update And Delete statements ”的,所以系统会根据 Select 语句自动生成相应的插入、更新和删除语句,而“ Use optimistic concurrency ”(冲突检测)和 Refresh the data table (刷新表格数据)是不选中的。

单击 Next ,将进入“ Choose Methods to Generate ”页面,在该页面系统会让我们命名在业务逻辑处理中的方法名称,这里有两类方法模式:

Fill 类: DataSet 将使用 Fill 类生成一个以 DataSet 或者 DataTable 作为参数的方法,该方法将使用前面生成的 SQL 语句来填充数据集。

Get 类:该类方法用来获取前面 SQL 语句或者存储过程执行的返回结果值。

2-50 显示了我的设定,其中 Fill 类使用的是 Fill 方法,而 Get 类命名的方法是 GetAllProducts

另外我还选中了下面的 GenerateDBDirectMethods ,这样系统将自动根据我前面的 Insert Update Delete 语句生成相应的方法。

单击“ Next ”会显示系统自动生成的结果,如果成功了,可以单击 Finish 之间完成该向导。


 
当关闭向导后,系统会自动打开 VS.NET 的设计器,在该设计器里可以看到类视图如图 2-51 image018.png 2-51 向导生成结果图

在图 2-51 上单击鼠标右键,选择“ View Code “,我们可以查看系统自动生成的 XSD 源代码,下面我们看看系统都生成了哪些代码

1、 使用 Connection 标识数据库连接

在前面向导里数据库的连接配置是通过 Connections Connection 表示的,这种配置会映射在 XSD 文档里,如代码 2-21 。正如您所看到的,数据库链接还包括了 Name Provider 等属性,它们都用于以后数据库的连接。

        <Connections>

          <Connection

AppSettingsObjectName="Web.config"

AppSettingsPropertyName="DatabaseConnectionString"

ConnectionStringObject=""

IsAppSettingsProperty="True"

Modifier="Assembly"

Name="DatabaseConnectionString (Web.config)"

ParameterPrefix="@"

PropertyReference="AppConfig.System.Configuration.ConfigurationManager.0.ConnectionStrings.DatabaseConnectionString.ConnectionString"

Provider="System.Data.SqlClient">

          </Connection>

        </Connections>

               代码 2-21 Database.xsd 代码片段( 1

 

2 、数据的执行用 XXXCommand 表示(这里是偶的解释,可以跳过)

   在前面的 SQL 语句向导里,由于要求系统根据 Select 语句自动生成 Delete Update Insert 语句以及方法,所以系统将使用 <SelectCommand> <DeleteCommand> <UpdateCommand> <InsertCommand> 来表示这些方法,并建立这些方法所需要的参数,如 2-22

      <DbSource

ConnectionRef="DatabaseConnectionString (Web.config)"

DbObjectName="dbo.Products" DbObjectType="Table"

FillMethodModifier="Public"

FillMethodName="Fill"                       GenerateMethods="Both"

GenerateShortCommands="True"           GeneratorGetMethodName="GetAllProducts"

GeneratorSourceName="Fill"                GetMethodModifier="Public"

GetMethodName="GetAllProducts"          QueryType="Rowset"

ScalarCallRetval="System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

UseOptimisticConcurrency="False"

UserGetMethodName="GetAllProducts" UserSourceName="Fill">

 

 

        <DeleteCommand>

                  <DbCommand CommandType="Text" ModifiedByUser="False">

         <CommandText>DELETE FROM [Products] WHERE (([ProductID] = @Original_ProductID))</CommandText>

                    <Parameters>

                      <Parameter AllowDbNull="False" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_ProductID" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="ProductID" SourceColumnNullMapping="False" SourceVersion="Original">

                      </Parameter>

                    </Parameters>

                  </DbCommand>

                </DeleteCommand>

 

 

       <InsertCommand>

              <DbCommand CommandType="Text" ModifiedByUser="False">

              <CommandText>INSERT INTO [Products] ([ProductName], [CategoryID], [Price], [InStore], [Description]) VALUES (@ProductName, @CategoryID, @Price, @InStore, @Description)</CommandText>

                    <Parameters>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@ProductName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="ProductName" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@CategoryID" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="CategoryID" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Currency" Direction="Input" ParameterName="@Price" Precision="0" ProviderType="Money" Scale="0" Size="0" SourceColumn="Price" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Int16" Direction="Input" ParameterName="@InStore" Precision="0" ProviderType="SmallInt" Scale="0" Size="0" SourceColumn="InStore" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Description" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="Description" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                    </Parameters>

                  </DbCommand>

                </InsertCommand>

              

 

 

        <SelectCommand>

                  <DbCommand CommandType="Text" ModifiedByUser="True">

                    <CommandText>SELECT     ProductID, ProductName, CategoryID, Price, InStore, Description

FROM         Products</CommandText>

                    <Parameters>

                    </Parameters>

                  </DbCommand>

                </SelectCommand>

 

 

 

                <UpdateCommand>

                  <DbCommand CommandType="Text" ModifiedByUser="False">

                    <CommandText>UPDATE [Products] SET [ProductName] = @ProductName, [CategoryID] = @CategoryID, [Price] = @Price, [InStore] = @InStore, [Description] = @Description WHERE (([ProductID] = @Original_ProductID))</CommandText>

                    <Parameters>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@ProductName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="ProductName" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@CategoryID" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="CategoryID" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Currency" Direction="Input" ParameterName="@Price" Precision="0" ProviderType="Money" Scale="0" Size="0" SourceColumn="Price" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="Int16" Direction="Input" ParameterName="@InStore" Precision="0" ProviderType="SmallInt" Scale="0" Size="0" SourceColumn="InStore" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="True" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Description" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="Description" SourceColumnNullMapping="False" SourceVersion="Current">

                      </Parameter>

                      <Parameter AllowDbNull="False" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_ProductID" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="ProductID" SourceColumnNullMapping="False" SourceVersion="Original">

                      </Parameter>

                    </Parameters>

                  </DbCommand>

                </UpdateCommand>

 

              </DbSource>

            </MainSource>

 

             代码 2-22 Database.xsd 部分代码( 2

 

3) 使用 Mapping 映射属性

对于数据库的列,系统使用 Mapping 元素将其映射为类的属性,并设置其类型,如代码 2 23.

            <Mappings>

              <Mapping SourceColumn="ProductID" DataSetColumn="ProductID" />

              <Mapping SourceColumn="ProductName" DataSetColumn="ProductName" />

              <Mapping SourceColumn="CategoryID" DataSetColumn="CategoryID" />

              <Mapping SourceColumn="Price" DataSetColumn="Price" />

              <Mapping SourceColumn="InStore" DataSetColumn="InStore" />

              <Mapping SourceColumn="Description" DataSetColumn="Description" />

            </Mappings>

            <Sources>

             代码 2-23 列和类属性的映射

 


通过上面的处理,这样我们就可以在代码里用如下的方法定义数据适配器、数据表和数据行,

  DatabaseTableAdapters.ProductsTableAdapter pta =

 new DatabaseTableAdapters.ProductsTableAdapter(); 

 Database.ProductsDataTable table  =  new Database.ProductsDataTable();

  Database.ProductsRow row   =  new Database.ProductsRow()

在使用时请注意默认的命名方式: DatabaseTableAdapters 映射整个适配器的命名空间,在该命名空间里包含多个数据适配表。

 

Simpe_DataAdapter.aspx 演示了上面代码的使用。代码 2-24 Simple_DataAdapter.aspx 布局代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Simple_DataAdapter.aspx.cs" Inherits="Simple_DataAdapter" %>

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<body>

    <form id="form1" runat="server">

    <div>

        <asp:GridView ID="GridView1" runat="server" CellPadding="4" Font-Names="Verdana"

            Font-Size="XX-Small" ForeColor="#333333" GridLines="None">

            ... ...

        </asp:GridView>

   

    </div>

    </form>

</body>

</html>

       代码 2-24 Simple_DataAdapter.aspx 布局代码

 

    代码 2-25 是该页面的后台代码。

public partial class Simple_DataAdapter : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        DatabaseTableAdapters.ProductsTableAdapter pta = new DatabaseTableAdapters.ProductsTableAdapter();

        GridView1.DataSource = pta.GetAllProducts();

        GridView1.DataBind();

      }

}

代码 2-25 Simple_DataAdapter.aspx.cs 后台代码

代码里的 GetAllProducts 来源与图 2-52 里预定义的方法。图 2-52 显示了运行结果。从整个操作中,我们几乎不用写代码,也不用设计到 ADO.NET 的细节就能够完成数据库里数据的读取。

image019.png
           
    
2-52 Simple_DataAdapter.aspx
运行结果



这里仅仅演示了数据集和数据适配器的基本使用,事实上,用数据集和数据适配器能够完成诸如 参数传递,存储过程,等工作,如果你在设计数据库时定义了表的关系,DataAdapter同样能够自动建立起映射关系。


查看。还是那句话,它用于DataAdapter显示数据挺好,而执行诸如update,delete等工作,确实是吃力不讨好的工作
如果你想知道DataAdapter的执行原理,也可以查看以前我发表的一篇文章
http://mqingqing123.cnblogs.com/archive/2005/10/11/252410.html

因为系统为你做的,就是自动化编译

以上内容仅供参考,不保证正确性。

posted on 2006-10-04 02:52 Technical Consultant 阅读(864) 评论(0)  编辑 收藏 引用 所属分类: Database


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿(3)

随笔分类(47)

随笔档案(45)

文章分类(87)

文章档案(87)

相册

C++

Database

Game Develope & Game Engine

Java

News

Web

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜