C#程序设计案例教程第六章_第1页
C#程序设计案例教程第六章_第2页
C#程序设计案例教程第六章_第3页
C#程序设计案例教程第六章_第4页
C#程序设计案例教程第六章_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章:ADO组件实现大案例数据访问第六章:ADO组件实现大案例数据访问6.1学习情境引入6.2基本知识1:ADO.NET3.0概述6.3基本知识2:使用DataReader访问数据库6.4基本知识3:使用DataSet的数据库应用程序6.5决策与计划6.6实施6.7检查与评价6.8训练6.1学习情境引入上一章我们学习了窗体的设计,管理信息系统就是由一个一个的窗体页面组成的。用相似的方法,我们就可以设计由多个窗体组成的管理信息系统。可以说,我们现在已经开始了管理信息系统的项目设计之旅。但存在两个问题,以书店管理系统为例:第一,上一章所设计的窗体界面仅仅是一些空架子,所有的文本框等控件都是空的,没有显示任何数据,而数据存储于后台数据库中,如何从后台数据库取出数据并把它显示到前台窗体的控件上;第二,在系统的运行过程中,需要用户输入图书信息、入库单信息、出库单信息等数据,这些数据除在前台窗体的控件中显示外,还需要保存到后台的数据库中,如何向数据库中存储在前台窗体界面产生的数据。6.1学习情境引入这两个问题归结起来,可以看作是同一个问题,即数据访问的问题。对于管理信息系统应用程序的数据访问,针对不同的数据库需要不同的数据引擎,VisualStudio.NET支持的数据访问方式有3种:ADO.NET、ADO和OLEDB。目前微软主推的是ADO.NET方式。ADO.NET是对传统ADO的改进,可用于创建分布式的数据共享应用程序,它是一种简单高效的应用程序编程接口。本章我们要利用ADO.NET组件,来初步实现书店管理系统中采购管理模块的数据访问。6.1学习情境引入6.1.1项目需求根据书店的日常业务分析,书店管理系统的采购管理模块有入库单填写、入库单管理、入库单打印等主要功能需求,以及图书信息添加、图书信息管理等辅助功能需求。1.填写入库单书店的采购人员根据图书采购合同将入库单编号、供应商、填单时间、经办人、是否付款、图书编号、进价、数量、金额等信息录入系统,生成入库单并通过入库单打印窗体进行打印。其中,入库单编号由系统自动生成;图书编号是根据图书名称查询图书得到的,若图书表中无此种图书,可以将此图书信息自动添加到图书表中;进价是根据定价和折扣率自动计算的;金额是根据进价和数量自动计算的。6.1学习情境引入2.入库单管理根据用户名和入库单的填单时间来查询入库单信息,并进行入库单信息管理(如果有错误信息,且该入库单尚未执行入库操作,允许删除后重新填写)和打印。3.入库单打印将用户填写的入库单信息或入库单管理窗体中查询到的入库单信息,以报表的形式打印成纸质入库单。4.图书信息添加将图书编号、图书名称、作者、出版社、出版时间、ISBN、定价、开本、版次、简介等图书的基本信息录入到系统中,便于在填写入库单时进行调用。5.图书信息管理根据图书的名称、作者、出版社、ISBN等图书信息进行图书查询,并可以对查询的图书信息进行管理操作(如果书店不再销售此种图书,可以将图书信息删除)。6.1学习情境引入6.1.2展示6.1.3技术分解在图6-1所示的图书信息管理窗体中,DataGridView控件中显示了5条包括图书ID、图书名称、作者、出版社、出版时间、ISBN等数据字段的图书信息记录,通过这些字段可以完整地描述一种图书的信息。书店日常销售的图书有成千上万种,那么就会产生上万条这样的图书记录,为了方便管理,通常将这些图书记录存放到数据库中。如图6-1所示的窗体中显示的就是通过ADO.NET的数据提供程序从数据库中查询得到的五条图书记录。6.1学习情境引入要从数据库中查询数据,首先需要通过ADO.NET的Connection组件实例建立与数据库的连接,通过Command组件实例来管理数据查询命令,通过DataAdapter组件实例调用数据库查询命令进行数据查询,并将查询所得数据填充到数据缓存DataSet中,再将DataSet“绑定”到图书信息查询窗体中的DataGridView控件实例来显示,图6-1所示的图书管理窗体就是这种情况。图6-5所示的入库单打印窗体就是将DataSet作为CrystalReport的数据源来进行显示。图6-4所示的入库单管理窗体中,查询得到的数据除了在窗体中显示外,还要进行修改和删除,然后再调用DataAdapter组件实例将更新后的结果回写到数据库中。6.1学习情境引入在图6-3所示的入库单添加窗体中,根据图书名称来查询图书作者、出版社、ISBN、定价、图书ID等信息时,可以不使用数据缓存DataSet,而仅使用DataReader直接从数据库中读取。这样可以省去DataSet架构推断、创建、填充的时间,以及DataSet的额外内存空间,所以程序整体会更高效。在图6-2图书信息添加窗体和图6-3入库单添加窗体中进行数据保存时,仅仅是向数据库中插入一行数据。这种情况下,可以不必使用DataReader或者DataSet组件,仅仅需要Connection和Command组件即可。另外,Command组件不仅仅管理文本形式的数据库操作命令,还可以使用存储过程。6.1学习情境引入总之,ADO.NET所提供的Connection、Command、DataReader、DataAdapter、DataSet等组件可以有多种组合技术、适用不同场合,完全满足前述需要。因此,本章需要了解的基本知识有:● Connection,Command组件。● DataReader,DataAdapter组件。● DataSet及相关组件。● 存储过程的创建与应用。6.2基本知识1:ADO.NET3.0概述6.2.1ADO.NET的基本组件1.ADO.NET的组件及命名空间ADO.NET主要用于为分布式应用程序提供数据访问机制,也就是应用于多层模型,尤其是B/S结构的三层以上的模式,这主要体现在ADO.NET引入了无连接的设计模型。ADO.NET包括两个主要部分:一部分是.NETFramework数据提供程序,另一部分是本地的数据缓存组件DataSet。DataSet组件属于System.Data命名空间。它专门为独立于任何数据源的数据访问而设计,也就是说,虽然不同的数据源需要不同的数据提供程序,但数据存放到DataSet中后,就已经是统一格式的了,不会再看到各种数据源的差别。各种不同的数据库管理系统、XML数据甚至程序员直接在DataSet中构建的数据结构,都是如此,这对于程序员操作数据是非常方便的。DataSet包含一个或多个DataTable对象的集合,这些对象由数据行和数据列以及有关DataTable对象中数据的主键、外键、约束和关系信息组成,DataSet就像一个内存中的关系数据库。6.2基本知识1:ADO.NET3.0概述ADO.NET数据提供程序包含Connection、Command、DataReader、DataAdapter等核心组件。Connection组件提供与数据源的连接。Command组件用以管理数据操作命令,比如查询数据、修改数据、执行存储过程等数据库命令。DataReader是从数据源中读取数据的一个读取器。DataAdapter是一个综合的数据提供程序,封装了Connection、Command、DataReader的功能,提供连接DataSet组件和数据源的桥梁,也就是说,对于无连接的数据访问,以数据读取为例,程序员即可以直接使用Connection、Command、DataReader的组合,自己处理将数据填充到DataSet中的所有操作,也可以简单地调用DataAdapter组件,让DataAdapter把数据填充到DataSet中。有些数据源用多种标准公开数据,也就是可以用多种方式访问此类数据源,如SQLServer可以用ODBC,也可以用OLEDB。但实际上,为了尽可能高效地访问每种数据源,在ADO.NET中对不同的数据源分别进行了针对性的优化,共包含了5类提供程序,如表6-1所示。6.2基本知识1:ADO.NET3.0概述用于SQLServer的.NETFramework数据提供程序(SqlClient)使用自己的协议与SQLServer进行通信,所使用的核心对象为SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader;而用于OLEDB的.NETFramework数据提供程序的核心对象为OleDbConnection、OleDbCommand、OleDbDataAdapter、OleDbDataReader。EntityClient提供程序是ADO.NET3.0中一个新的概念,用于基于实体数据模型(EDM)访问数据。实体数据模型是基础数据源与数据处理逻辑之间的一个层,因此EntityClient提供程序与其他.NETFramework数据提供程序不同,该提供程序不直接与数据源进行交互,而是使用实体SQL与基础数据提供程序进行通信。在本书中,将主要介绍用于SQLServer的.NETFramework数据提供程序。但这些数据提供程序呈现给程序员的用法是非常一致的,除了Connection组件的连接字符串不同外,基本上就只是组件名前缀的不同。6.2基本知识1:ADO.NET3.0概述2.数据库访问方式的选择并不是所有的数据库应用都需要获得结果集,有时候仅仅需要执行一个数据库操作,比如执行DBMS上的一个插入数据的操作。这种情况下,不必使用DataReader或者DataSet组件,仅仅需要Connection和Command组件,后面的【例6-6】,就是这种情况的一个例子。但多数情况下,完整的数据库应用程序,一般要求取得结果集,这时需要使用DataSet来缓存数据。有时即使需要结果集,但对于大数据,比如图像数据,仅使用DataReader直接从数据库中读取,而不使用DataSet,可以省去DataSet架构推断、创建、填充的时间,以及DataSet的额外内存空间,所以程序整体会更高效。根据这些不同的情况,本章将数据访问分为使用DataReader和使用DataSet两种情况来介绍。另外,由于使用存储过程和使用命令文本的Command有些不同,本章也专门介绍了使用存储过程的数据访问。6.2基本知识1:ADO.NET3.0概述实际上,VS.NET2005以后,程序员还可以通过可视化的方法,构建通用的数据访问程序。VS.NET通过TableAdapter组件进一步封装了.NET数据提供程序,让程序员只需面对DataSet中的数据表,虽然灵活性稍差,但更加便捷高效。这种数据访问方式,将在下一章介绍。从数据操作程序开发所使用的组件的角度,按照ADO.NET的结构,图6-6给出了ADO.NET的运行机制,后面几节将按照此图来学习ADO.NET各组件的使用。6.2基本知识1:ADO.NET3.0概述6.2基本知识1:ADO.NET3.0概述6.2.2自测1.填空题(1)使用用于SQLServer的.NETFramework数据提供程序来访问数据库时,应首先引入

命名空间。(2)用于SQLServer的.NETFramework数据提供程序的核心组件为

、SqlCommand、

、SqlDataReader。(3)DataReader组件以

方式来返回数据访问所得数据。2.思考题(1)在进行数据访问时,DataSet组件和DataReader组件如何选用?6.3基本知识2:使用DataReader访问数据库

如前所述,使用DataReader的数据库应用程序需要使用Connection组件建立到数据源的连接,然后执行Command组件的SQL命令,将结果通过DataReader组件返回,供程序使用。本节就以SQLServer2005Express数据源为例,依次介绍这几种组件。请注意本节最后的【例6-9】是完整的程序,而其他普通例子需要读者补充完整才能运行。另外,本节的例子需要引用System.Data.SqlClient命名空间。6.3基本知识2:使用DataReader访问数据库

6.3.1SqlConnection类ADO.NET通过SqlConnection对象实例来管理与SQLServer数据源的一个唯一的会话。SqlConnection对象通常与SqlDataAdapter和SqlCommand对象一起使用,可以获得连接SQLServer7.0以上版本数据库的极高性能。1.常用构造函数SqlConnection类有如下两个重载的构造函数。● SqlConnection():初始化SqlConnection的新实例。● SqlConnection(string):根据连接字符串初始化SqlConnection的新实例。6.3基本知识2:使用DataReader访问数据库

【例6-1】初始化一个SqlConnection的新实例connection。SqlConnectionconnection=newSqlConnection();【例6-2】根据连接字符串初始化一个SqlConnection的新实例connection。SqlConnectionconnection=newSqlConnection(@"server=.\SQLEXPRESS;Database=bookstore;IntegratedSecurity=sspi;");6.3基本知识2:使用DataReader访问数据库

2.常用属性SqlConnection对象的常用属性是ConnectionString。该属性是string类型值,用于设置一个不区分大小写的连接字符串,该字符串包含了连接到某个SQLServer数据库所需的连接属性的信息。这些属性信息如【例6-2】所示,每种信息包含关键字和值两部分,各种信息之间用分号隔开。【例6-2】中的连接字符串表示:连接到默认安装的SQLServer2005Express服务器上的bookstore数据库,身份验证方式是Windows集成身份验证。ConnectionString设置好后,系统会进行语法分析,排除语法异常,但连接字符串正确与否,只能由数据源验证。6.3基本知识2:使用DataReader访问数据库

3.常用方法(1)Open方法。使用ConnectionString所指定的属性设置打开数据库连接。(2)Close方法。关闭与数据库的连接。在使用SqlDataReader的数据库应用程序中,由于对数据源的访问是有连接的,所以在设置了ConnectionString后,还要调用SqlConnection实例的Open方法打开数据连接,才能执行SqlCommand对象所包含的SQL命令,返回SqlDataReader实例,处理完数据后,再调用SqlConnection实例的Close方法关闭数据连接。这两种方法的使用请参见本节【例6-9】。6.3基本知识2:使用DataReader访问数据库

6.3.2SqlCommand类SqlCommand类是执行SQL命令的组件,该命令可以是Transact-SQL语句或存储过程。1.常用构造函数SqlCommand的构造函数可以有命令文本、连接名称、事务名称等3个参数,共有4个重载版本。常用的构造函数如下。● SqlCommand():初始化SqlCommand类的新实例。● SqlCommand(string,SqlConnection):初始化具有命令文本和SqlConnection的SqlCommand类的新实例。【例6-3】初始化具有命令文本和SqlConnection的SqlCommand类的新实例。SqlCommandcommand=newSqlCommand("select*frombook_info",connection);6.3基本知识2:使用DataReader访问数据库

2.常用属性(1)CommandType属性。CommandType属性说明此SqlCommand实例的CommandText是何种类型。它的取值是CommandType枚举类型,CommandType.Text表示CommandText包含Transact-SQL语句,CommandType.StoredProcedure表示CommandText包含存储过程名称。CommandType属性的默认值是CommandType.Text。(2)CommandText属性。CommandText属性值可以是SqlCommand实例要对数据库执行的Transact-SQL语句或存储过程。(3)Connection属性。Connection属性包含SqlCommand实例使用的SqlConnection对象实例。6.3基本知识2:使用DataReader访问数据库

【例6-4】初始化SqlCommand类的新实例,并设置CommandText和Connection属性。SqlCommandcommand=newSqlCommand();command.CommandText=”select*frombook_Info”;command.Connection=connection;(4)Parameters属性。SqlParameterCollection对象,表示CommandText中使用的参数集合。CommandText中允许使用参数,参数名称前加“@”符号。在调用存储过程的场合,经常用到SqlCommand的Parameters属性。【例6-5】初始化SqlCommand类的新实例,并使用带参数的CommandText。SqlCommandcommand=newSqlCommand("select*frombook_infowhereBookID>@BID",connection);SqlParameter

parameterPubId=command.Parameters.Add("@BID",SqlDbType.Int,10);parameterPubId.Value=100;6.3基本知识2:使用DataReader访问数据库

【例6-6】初始化SqlCommand类的新实例,将调用名为“proc_Book_Info_Insert”的存储过程。该存储过程要求两个输入参数,分别为@name和@price。SqlCommandcommand=newSqlCommand("proc_Book_Info_Insert");command.CommandType=CommandType.StoredProcedure;SqlParameter

parameterName=command.Parameters.Add("@name",

SqlDbType.NVarChar,20);parameterClass.Direction=ParameterDirection.Input;parameterClass.Value="c#程序设计案例教程";SqlParameter

parameterPrice=command.Parameters.Add("@price",

SqlDbType.Decimal,18);parameterPrice.Direction=ParameterDirection.Input;parameterPrice.Value=32.00;6.3基本知识2:使用DataReader访问数据库

在上面两个例题中,出现的“@BID”、“@name”、“@price”是参数名称,通常以“@参数名”的格式指定;SqlDbType表示参数在Transact-SQL中的数据类型,默认为NVarChar;SqlDbType属性后面紧跟的数字是Size属性值,表示列中数据的最大长度(以字节为单位),默认值是从参数类型得出的;Direction属性用来指明参数是只可输入、只可输出、双向还是存储过程返回值参数,取值为ParameterDirction枚举类型,有4种枚举值——Input、Output、InputOutput和ReturnValue;Value属性表示参数的值,Object类型,默认值为空。Parameters类还有很多属性、方法和事件,需要时可按“F1”进入帮助界面,在“索引”的“查找”项中输入“SqlParameter

类”,就可以查询到。6.3基本知识2:使用DataReader访问数据库

3.常用方法(1)ExecuteReader方法。将CommandText发送到Connection交给SQLServer执行,并生成一个SqlDataReader实例返回,通过此SqlDataReader可以访问执行结果。一般在执行查询命令时使用该方法,该方法的使用请参见本节【例6-9】。(2)ExecuteNonQuery方法。对连接执行Transact-SQL语句仅返回受影响的行数。一般在执行插入、更新语句,或不返回结果集的存储过程时,使用该方法。【例6-7】用SqlCommand的ExecuteNonQuery()方法实现图书信息的添加。6.3基本知识2:使用DataReader访问数据库

(3)ExecuteScalar方法。返回查询所返回的结果集中的第一行第一列,忽略其他列或行。一般在执行统计查询时,使用该方法。【例6-8】用SqlCommand的ExecuteScalar()方法执行一个统计语句。SqlCommandcommand=newSqlCommand("selectcount(*)frombook_info",conn);conn.Open();textBoxBookCount.Text=command.ExecuteScalar().ToString();conn.Close();6.3基本知识2:使用DataReader访问数据库

6.3.3SqlDataReader类SqlDataReader类提供一种从SQLServer数据库读取行的只进流的方式,是一种高效率访问组件。1.SqlDataReader类的实例化若要创建SqlDataReader,必须调用SqlCommand对象的ExecuteReader方法,而不要直接使用构造函数。2.常用属性(1)FieldCount属性。获取当前行中的列数。(2)Item属性。Item实际上是一个索引器,提供了一种像访问数组一样访问类或结构的方法。Item索引器有两种重载形式,一种按列序号索引,另一种按列名索引。6.3基本知识2:使用DataReader访问数据库

3.常用方法(1)Read方法。该方法使SqlDataReader实例前进到下一条记录,即下一行。若存在多个行,则返回true,否则返回false。注意SqlDataReader的默认位置在第一条记录前面,因此必须调用Read方法来访问任何数据。(2)Close方法。SqlDataReader是有连接访问的组件,Close方法可以关闭连接。6.3基本知识2:使用DataReader访问数据库

6.3.4使用SqlDataReader访问数据库6.3基本知识2:使用DataReader访问数据库

6.3.5演练1.实验题目入库单填写。2.实验目的● 掌握ADO.NET中Command组件、Connection组件、DataReader组件的常用方法、属性。● 能够利用Connection组件建立与数据库的连接,利用Command组件来实现数据访问。● 能够利用DataReader组件来实现数据访问。3.实验内容在书店管理系统中,填写入库单是一个很重要的业务模块,具体业务流程是:书店的采购人员根据图书采购合同将入库单编号、供应商、填单时间、经办人、是否付款、图书编号、进价、数量、金额等信息录入系统,生成入库单并通过入库单打印窗体进行打印,其中,入库单编号由系统自动生成;图书编号根据图书名称查询图书表得到,若图书表中无此种图书,可以将此图书自动添加到图书表中;进价根据定价和折扣率自动计算;金额根据进价和数量自动计算。请结合以上业务流程信息,实现入库单填写窗体的功能,具体界面如图6-11所示。6.3基本知识2:使用DataReader访问数据库

6.3.6自测1.选择题(1)以下

参数是设置非Windows集成安全下的数据库连接。a.Trusted_Connection=Yesb.userid=sa;password=111c.IntegratedSecurity=Trued.IntegratedSecurity=SSPI(2)数据库连接中的参数设置ConnectionTimeout=10表示

。a.设置数据库连接超时为10秒钟。b.设置数据库连接的用户最多为10个。c.设置数据库连接超时为10毫秒。d.设置数据库连接的次数不能超过10次。6.3基本知识2:使用DataReader访问数据库

(3)SQL语句“deletefrombook_info”,需要SqlCommand组件的

方法来执行。a.ExecuteNonQuery()b.ExecuteScalar()c.ExecuteReader()d.ExecuteXmlReader()(4)SQL语句“selectcount(*)frombook_info”,需要SqlCommand组件的

方法来执行。a.ExecuteNonQuery()b.ExecuteScalar()c.ExecuteReader(d.ExecuteXmlReader()(5)SQL语句“CreateTablebook_info(bookid

int,booknamenvarchar(50))”,需要SqlCommand组件的

方法来执行。a.ExecuteNonQuery()b.ExecuteScalar()c.ExecuteReader()d.ExecuteXmlReader()6.3基本知识2:使用DataReader访问数据库

(6)通常情况下,DataReader对象在内存中保留

数据。a.多行b.两行c.一行d.零行2.填空题(1)数据库连接字符串"Serve=abc;Database=Northwind;UID=sa;Pwd=;"中,Server指的是

。(2)若要执行一条更新SQL语句,应该使用Command对象的

方法。(3)使用Command对象的

方法可以创建一个DataReader对象。6.4基本知识3:使用DataSet的数据库应用程序

DataReader组件只能提供只读的、只向前的数据访问,要使用更强大功能的数据库应用程序,应该使用DataSet组件。如图6-6所示,使用DataSet的数据库应用程序也需要Connection组件建立到数据源的连接,然后执行Command组件的SQL命令,返回结果到DataSet组件中,供程序使用。由于DataSet和DataReader使用相同的Connection组件和Command组件,故不再赘述。实际上,在ADO.NET中,使用DataReader的数据库应用程序是用编写代码的方式实现的,是ADO.NET的基本使用方法。DataReader是数据提供程序的一部分,DataSet也是使用DataReader进行填充的。而ADO.NET进行了无连接设计,面向无连接的DataSet组件提供了更强大的数据操作功能。通过这些功能,就可以创建以DataSet为中心的、功能强大的数据库应用程序。6.4基本知识3:使用DataSet的数据库应用程序

6.4.1DataSet类DataSet是从数据源中检索到的数据在内存中的缓存。它是ADO.NET结构的主要组件,是支持ADO.NET的断开式、分布式数据方案的核心对象。无论数据源是什么,它都会提供一致的关系编程模型。DataSet和DataTable对象是仅有的可以远程处理的ADO.NET对象。DataSet可将数据和架构作为XML文档进行读写。DataSet就像一个内存中的关系数据库。DataSet由一组DataTable对象组成,各个DataTable可以通过DataRelation对象互相关联。关系及约束对象使DataSet可以实施数据完整性。DataView是DataTable的数据视图,提供了筛选、排序等功能。6.4基本知识3:使用DataSet的数据库应用程序

1.常用构造函数● DataSet():初始化DataSet类的新实例。● DataSet(string):初始化DataSet类的新实例,并给DataSetName属性赋值。【例6-10】初始化一个DataSet类的新实例ds。//初始化一个DataSet类的新实例dsDataSet

ds=newDataSet();//初始化一个DataSet,并命名为bookstoreDataSet

ds=newDataSet("bookstore");6.4基本知识3:使用DataSet的数据库应用程序

2.常用属性● Tables:获取包含在DataSet中DataTable的集合,在此集合中的DataTable可以按添加表的先后序号索引,也可以按表名索引。【例6-11】引用DataSet中的数据表。//初始化一个DataSetDataSet

ds=newDataSet();//通过DataSet的Tables属性的Add方法向DataSet添加一个DataTableDataTable

dt=ds.Tables.Add("book_Info");在上例中,ds.Tables[0]和ds.Tables["book_Info"]是指的同一个DataTable。6.4基本知识3:使用DataSet的数据库应用程序

3.常用方法● Clear方法:通过移除所有表中的所有行来清除任何数据的DataSet。● Copy方法:返回新的DataSet,具有与该DataSet相同的结构(表架构、关系和约束)和数据。【例6-12】复制DataSet内容。//初始化一个DataSet,并命名为bookstoreDataSet

ds=newDataSet("bookstore");//建立DataSet的原样副本,包含架构和全部数据DataSet

copyDS=ds.Copy();6.4基本知识3:使用DataSet的数据库应用程序

6.4.2DataTable类及DataTable的数据列与数据行1.DataTable类DataTable对象是内存中的一个数据表。它可以包含在DataSet对象中,也可以独立存在。DataTable中,用数据行DataRow对象的集合包含数据,用DataColumn对象集合包含数据表架构,用DataView对象维护数据表视图。并且还有其他对象用于维护表之间的主从关系、数据约束和用户自定义属性。有一个细节是,当通过DataSet对象的Tables属性访问DataTable对象时,请注意它们是按条件区分大小写的。例如,如果一个DataTable被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。6.4基本知识3:使用DataSet的数据库应用程序

(1)常用构造函数。● DataTable():初始化DataTable类的新实例。● DataTable(string):初始化DataTable类的新实例,并给DataTableName属性赋值。【例6-13】初始化一个DataTable类的新实例dt。//初始化一个DataTable,并命名为book_InfoDataTable

dt=newDataTable("book_Info");//初始化一个DataTable实例,并添加到DataSet中DataSet

ds=newDataSet();DataTabledt2=ds.Tables.Add("book_Info");将DataTable添加为一个DataSet的Tables集合的成员后,不能再将其添至任何其他的DataSet的Tables集合。6.4基本知识3:使用DataSet的数据库应用程序

(2)常用属性。● Columns:表示数据表的列集合,即DataColumn对象的集合,DataColumn是用于创建DataTable架构的基本构造块。● Rows:表示数据表的行集合。(3)常用方法● NewRow:新建与该表的架构相同的数据行,但该行还必须调用Rows集合的Add方法,才能将该行添加到数据表。6.4基本知识3:使用DataSet的数据库应用程序

2.DataTable的数据列DataColumn类(1)常用构造函数。● DataColumn(string,Type):使用指定列名称和数据类型初始化DataColumn类的新实例。● DataColumn(string,Type,string):使用指定的列名称、数据类型和表达式初始化DataColumn类的新实例。6.4基本知识3:使用DataSet的数据库应用程序

3.DataTable的数据行DataRow类(1)构造函数。● DataRow():初始化DataRow实例,实用中,常调用DataTable的NewRow()方法,以返回一个符合DataTable架构的新行。(2)主要属性。● Item:一行数据中各列数据的索引器,可以按DataColumn对象名、按列名、按列顺序号等进行索引。6.4基本知识3:使用DataSet的数据库应用程序

【例6-14】创建一个DataTable实例bookTable,并向bookTable添加数据。//初始化一个DataTable,并命名为book_InfoDataTable

bookTable=newDataTable("book_info");//利用DataTable的Columns属性的Add()方法添加新列BookIDDataColumntableC1=bookTable.Columns.Add("BookID",typeof(Int32));//将BookID列的属性设为不允许DBNull,并将值约束为唯一tableC1.AllowDBNull=false;tableC1.Unique=true;//将BookID列设置为自动递增tableC1.AutoIncrement=true;tableC1.AutoIncrementSeed=1000;tableC1.AutoIncrementStep=1;//将BookID列设置为主键列bookTable.PrimaryKey=newDataColumn[]{bookTable.Columns["BookID"]};//继续添加两个新列bookTable.Columns.Add("BookName",typeof(string));bookTable.Columns.Add("BookAuthor",typeof(string));//调用DataTable的NewRow()方法生成新数据行,并设置数据值DataRow

tableRow=bookTable.NewRow();tableRow["BookName"]="C#2005程序设计案例教程";tableRow["BookAuthor"]="李正吉";//调用DataTable的Rows属性的Add()方法添加数据行bookTable.Rows.Add(tableRow);6.4基本知识3:使用DataSet的数据库应用程序

在上例中,“tableC1.AllowDBNull=false;tableC1.Unique=true;”两句代码是将新增的tableC1列设置为不允许为空,并设值约束为唯一;“tableC1.AutoIncrement=true;tableC1.AutoIncrementSeed=1000;tableC1.AutoIncrementStep=1;”将新增的tableC1列设置为自动递增列,初始值为1

000,每次递增1。这些代码语句都在设置DataColumn类的属性。DataColumn类还有很多的属性、方法和事件,需要时可按F1键进入“帮助”界面,在“索引”的“查找”项中输入“DataColumn类”,即可查询到。6.4基本知识3:使用DataSet的数据库应用程序

6.4.3SqlDataAdapter类SqlDataAdapter类封装了DataSet到远程数据源的访问组件,包含一组SqlCommand对象和一个SqlConnection对象,它提供用于填充DataSet和更新SQLServer数据库的方法。它是ADO.NET中用于SQLServer的.NETFramework数据提供程序的一个核心组件。1.常用构造函数● SqlDataAdapter(string,SqlConnection):使用SelectCommand和SqlConnection对象初始化SqlDataAdapter类的新实例。【例6-15】初始化SqlDataAdapter类的一个实例sda。//使用SelectCommand和SqlConnection对象SqlDataAdapter

sda=newSqlDataAdapter("select*frombook_info",conn);6.4基本知识3:使用DataSet的数据库应用程序

2.常用属性● SelectCommand:SqlCommand对象,一般包含SQL查询语句,需要程序员设置。从图6-6可以看出,SqlDataAdapter要通过SqlCommand操纵数据。SqlDataAdapter可以管理4个SqlCommand,它们分别为SelectCommand、InsertCommand、UpdateCommand和DeleteCommand。其中SelectCommand是获取数据集架构和数据的基础,它是SqlDataAdapter的必备属性。InsertCommand、UpdateCommand和DeleteCommand属性可以由系统根据SelectCommand自动生成。这需要定义一个SqlCommandBuilder类的实例与该SqlDataAdapter类的实例关联,并且数据表要有主键,同时SelectCommand返回的列中包括此主键列。6.4基本知识3:使用DataSet的数据库应用程序

3.常用方法● Fill方法:用SelectCommand的返回结果填充DataSet或DataTable,返回值为填充的行数,常用的三个重载版本如下:Fill(DataSet):填充数据集。Fill(DataTable):填充数据表。Fill(DataSet,string):填充数据集中指定名称的数据表。● Update方法:根据DataSet或DataTable中数据更新的情况,恰当地调用InsertCommand、UpdateCommand、DeleteCommand,将本地缓冲数据保存到数据库。若没有自动生成InsertCommand、UpdateCommand、DeleteCommand,需要程序员为这些SqlCommand对象赋值,否则不能使用Update方法;该方法返回值为更新的行数,其常用的重载版本形式与Fill方法相似。6.4基本知识3:使用DataSet的数据库应用程序

【例6-16】初始化SqlDataAdapter类的一个实例sda,并通过调用sda的Fill方法来填充一个DataSet实例。SqlDataAdapter

sda=newSqlDataAdapter("select*frombook_info",conn);DataSet

bookDataSet=newDataSet();sda.Fill(bookDataSet,"book_info");【例6-17】初始化SqlDataAdapter类的一个实例sda,并通过一个SqlCommandBuilder类的实例scb,在调用sda的Update方法时,自动生成所需的SqlCommand对象。SqlDataAdapter

sda=newSqlDataAdapter("select*frombook_info",conn);SqlCommandBuilder

scb=newSqlCommandBuilder(sda);sda.Update();6.4基本知识3:使用DataSet的数据库应用程序

6.4.4使用SqlDataAdapter和DataSet访问数据库【例6-18】使用SqlDataAdapter和DataSet实现图书信息查询。

6.4基本知识3:使用DataSet的数据库应用程序

6.4.5在SqlDataAdapter中使用存储过程在Winform应用程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论