上一篇文章介绍了使用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 DataSetsBusiness Objects的比较

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

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

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


图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图2-44 TableAdapter Configuration Wizard”向导

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

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

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

图2-46 使用SQL语句

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

图2-47 Query Builder查询器

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

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

FROM         Products

图2-48 生成SQL语句

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


图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。图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的细节就能够完成数据库里数据的读取。

              图2-52 Simple_DataAdapter.aspx运行结果

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

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

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

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

数据访问模式二:数据集和数据适配器(传统的数据访问模式)相关推荐

  1. Scott Mitchell 的ASP.NET 2.0数据教程之二十四:: 分页和排序报表数据

    下载代码示例 | 下载PDF格式英文教程 导言 分页和排序是在WEB应用程序中展现数据常见的功能.比如,当我们在一个网上书店搜索ASP.NET书籍的时候,可能有几百本相关书籍,但是我们只希望每页显示1 ...

  2. ASP.NET 2.0数据教程之二十四:: 分页和排序报表数据

    导言 分页和排序是在WEB应用程序中展现数据常见的功能.比如,当我们在一个网上书店搜索ASP.NET书籍的时候,可能有几百本相关书籍,但是我们只希望每页显示10条有效记录.而且,我们还希望结果能根据标 ...

  3. 大数据学习笔记二:Ubuntu/Debian 下安装大数据框架Hadoop

    文章目录 安装Java 为Hadoop创建用户 安装Hadoop 配置Hadoop 配置环境变量 设置配置文件 格式化namenode 启动hadoop集群 访问hadoop集群 大数据学习系列文章: ...

  4. MySQL简单表的数据_MySQL(二)表的操作与简单数据操作

    六大约束:主键约束.外键约束.非空约束.唯一约束.默认约束.自动增加 1.not null非空 2.defaul默认值,用于保证该字段的默认值 ; 比如年龄:1900-10-10 3.primar k ...

  5. 【数据可视化】大作业(意向考研高校的数据可视化)

    文章目录 前言 一.数据介绍 1.1 基本信息 1.2 考研信息 1.3 导师信息 二.预处理及分析 2.1 数据预处理 2.1.1 考研信息预处理 2.1.2 导师信息预处理 2.2 数据分析 三. ...

  6. 2021年大数据Hive(二):Hive的三种安装模式和MySQL搭配使用

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的三种安装模式和MySQL搭配使用 一.Hive的安装方 ...

  7. 以对象的方式来访问xml数据表(二)

    为什么要以对象的方式来访问xml数据表? 还记得,自己是在一次完成师兄布置的任务时接触到了xml,那时候需要用xml来作为数据文件,保存一个简单的图书管理系统的数据.于是就知道了,可以用xml文件来保 ...

  8. Scott Mitchell 的ASP.NET 2.0数据教程之二十一:: 实现开放式并发

    在ASP.NET 2.0中操作数据:实现开放式并发 下载本教程中的编码例子 | 下载本教程的PDF版 导言 对于那些仅仅允许用户查看数据,或者仅有一个用户可以修改数据的web应用软件,不存在多用户并发 ...

  9. 11300001数据集配置错误_Power BI 中的数据刷新(二)

    接着上篇文章我们接着谈谈Power BI 中的数据刷新(二) 查看数据基础结构依赖项 无论采用哪种存储模式,都必须能够访问基础数据源,否则将无法成功刷新数据. 有三种主要的数据访问方案: 数据集使用驻 ...

最新文章

  1. ecplise 多工程项目如何进行树形展示
  2. Ubuntu 14.04 opencv 2.4.9 安装
  3. 【杂谈】一招,同时可视化18个开源框架的网络模型结构和权重
  4. 吉林省统考计算机英语作文,2019年吉林省学位英语作文必背范文(我最……的题材) - 希赛网...
  5. 6、java中的排序算法
  6. Petuum - Careers
  7. 图片马赛克去除工具_图片太多该如何进行排版呢?
  8. 【华为云技术分享】【技术总结】从Hash索引到LSM树
  9. Meta Learning | 加了元学习之后,少样本学习竟然可以变得这么简单!
  10. vue组件之间的参数传递
  11. android多线程计时器,Android 计时器Timer用法
  12. Zookeeper,Hbase 伪分布,集群搭建
  13. Java中如何使某个类的对象唯一性,只能创建一个对象
  14. Exchange2010 server的部署及配置(一)
  15. 苹果手机突然闪退的7个原因及修复方法
  16. Camtasia Studio 8
  17. 【实战教程】使用知晓云完成微信卡券消息的处理
  18. AppOps命令分析
  19. 矢量数据shp七个文件介绍_Arcmap入门(五)——矢量数据的提取分析(裁剪+分割)...
  20. mysql试题百度云_MYSQL练习题及答案

热门文章

  1. 20190421-那些年使用过的CSS预处理器(CSS Preprocessor)之Sass and Less
  2. 【洛谷P1538】迎春舞会之数字舞蹈
  3. CSharp之界面美化
  4. Hive Cilent数据操作
  5. bootstrap导航
  6. (九)React面试真题演练
  7. Echarts实现环形图的渐变颜色效果
  8. python爬取基金历史净值_Python爬取天天基金网历史净值数据
  9. 全网段ip扫描工具安卓_我是如何打造个人专属网络扫描利器
  10. Sequence Classification with LSTM Recurrent Neural Networks in Python with Keras-学习笔记