非连接环境下的数据连接--使用DataSet和DataAdapter主讲:梁瑞仕Email/QQ:liangrs@foxmail.c om第1部分:构建DataSet和DataTable使用非连接环境构建DataSet和DataTable思考与回顾读取数 据集&数据表中的数据本节内容使用非连接环境构建DataSet和DataTable思考与回顾读取数据集&数据表中的数据使 用非连接环境本节内容使用非连接环境构建DataSet和DataTable思考与回顾读取数据集&数据表中的数据DataS et的概念什么是DataSet?内存中的数据缓存,一个无连接的“关系数据库”可以包含表、视图、数据关系、约束可以对Data Set中的数据进行查询、排序、筛选、过滤、编辑、更新,并将更新后的数据提交回数据源优点:当浏览和加工DataSet中的数据时, 并不需要建立同数据源的持续连接,节省资源增加了应用程序的性能和扩展性允许用户“随时随地”访问数据与数据源无关的数据模型D ataSet对象模型DataSet包含的集合表集合(DataTable对象的集合)关系集合(DataRelation对象的集 合)DataSet对象模型DataSet对象模型数据集(DataSet)与关系数据库相似的对象模型保存数据:表、行、列 可以在数据集中定义约束与关系数据表(DataTable)代表了数据集中的表,可以从数据源加载数据由数据列组成数据列(Dat aColumn)由DataType属性指定对应的数据类型列的数据类型与数据库中列的类型保持匹配数据行(DataRow) 表示表中包含的实际数据。DataRow用于检索、计算和处理表中的数据。构建DataSet和DataTable四种创建方式: 通过编程,“纯手工”打造DataSet和DataTable通过图形化方式,拖动DataSet控件到窗体并设置属性通过Data Adapter“数据搬运工”将数据从数据源搬运到DataSet从XML文件中获取数据和架构构建DataSet和DataTa ble创建DataSet对象可以通过调用DataSet构造函数来创建DataSet的实例,并可以选择指定一个名称参数。 如果没有为DataSet指定名称,则该名称会设置为“NewDataSet”。创建DataTable对象,添加DataCol umn列将表添加到DataSet中演示:课堂练习:构建DataSet和DataTable编程实现DataSet和Dat aTable1.分别创建数据列,数据表,数据集;2.将列加入到表中,将表加入到数据集中3.添加数据行课堂练习:构建 DataSet和DataTable本节内容使用非连接环境构建DataSet和DataTable思考与回顾读取数据集&数据 表中的数据1.为什么要用数据集?非连接环境下,对数据进行处理/运算的过程中(在内存中进行),并不需要与数据源实时保持连接(因 为连接代价和开销是很可观的),仅当:获取数据源的最新数据(到内存中)(从内存中)将最新的数据更新到数据源才与数据源建立连接, 使得数据连接的代价最小化。并可适应于多种数据应用场景,提高应用程序的移植性和扩展性。因此:正常情况下,在内存中进行数据处理时,不 需要与数据源保持连接。正因为这种情况的普遍存在,催生了ADO.NET中的数据集DataSet的概念。2.数据集(DataSe t)是什么?能做什么?数据集是包含数据表的对象,可以在这些数据表中临时存储数据以便在应用程序中使用。如果应用程序要求使用数据, 则可以将该数据加载到数据集中,数据集在本地内存中为应用程序提供了待用数据的缓存。即使应用程序从数据库断开连接,也可以使用数据集中 的数据。数据集维护有关其数据的更改的信息,因此可以跟踪数据更新,并在应用程序重新连接时将更新发送回数据库。3.ADO.NET 中的DataSet对象结构简单的说,DataSet实际上就是关系数据库在内存中的一个映射。关系数据库能完成的事情,利用DataS et也能在内存中完成,只不过它不会实时更新到数据源而已(需手动将更新后的数据提交回数据源)。DataSet的结构类似于关系数据库 的结构;它公开表、行、列、约束和关系的分层对象模型。DataSet对象模型DataSet包含的集合表集合(DataTabl e对象的集合)关系集合(DataRelation对象的集合)DataSet对象模型DataSet对象模型数据集(Data Set)与关系数据库相似的对象模型保存数据:表、行、列可以在数据集中定义约束与关系数据表(DataTable)代表了数据集 中的表,可以从数据源加载数据由数据列组成数据列(DataColumn)由DataType属性指定对应的数据类型列的数据类型 与数据库中列的类型保持匹配数据行(DataRow)表示表中包含的实际数据。DataRow用于检索、计算和处理表中的数据 。回顾&练习1如何创建一个名字为MyDataSet的数据集DataSet对象?DataSetds=newDat aSet("MyDataSet");2如何创建一个名字为MyDataTable的数据表DataTable对象?并将MyDa taTable加入到MyDataSet的数据集?DataTableMyDataTable=newDataTable( "MyDataTable");ds.Tables.Add(MyDataTable);回顾&练习3如何创建一个名字为 ID,类型为int的数据列DataColumn对象?并将其加入到MyDataTable的数据表?A使用DataCol umn构造函数:DataColumncolumnID=newDataColumn("ID",typeof(int)) ;MyDataTable.Columns.Add(columnID);B通过调用表的Columns属性的Add方法 MyDataTable.Columns.Add("ID",typeof(int));回顾&练习4假设MyDataTab le数据表中包含2列:int类型的ID,string类型的name,如何添加一行数据(1,“ado.net”)到MyData Table的数据表对象?A通过逐项添加每列的数据:DataRowdatarow1=MyDataTable.NewR ow();datarow1[0]=1;//使用下标引用数据列datarow1[“name”]=“ado.net”; //使用索引器引用数据列MyDataTable.Rows.Add(datarow1);B通过传入整行全部数值的数组(类型化 为Object),调用MyDataTable的Add()方法加入:MyDataTable.Rows.Add(newObjec t[]{1,"ado.net"});回顾&练习5如何将ID设置为MyDataTable表的PrimaryKey? 方法一:设置MyDataTable表的PrimaryKey属性:MyDataTable.PrimaryKey=newDa taColumn[]{columnID};方法二:设置MyDataTable表的约束Constraints以创建主键:MyD ataTable.Constraints.Add("pk_customer",columnID,true);Nextste p如何读取数据集&数据表中的数据?本节内容使用非连接环境构建DataSet和DataTable思考与回顾读取数据集&数 据表中的数据读取数据集&数据表中的数据数据全部保存在DataRow对象中DataRow是DataTable的主要组件, 并且每列的数据与DataColumn指定的列对应。使用DataRow对象及其属性和方法检索、插入、删除和更新DataTab le中的值。演示演示:读取数据集&数据表中的数据课堂练习将上次课程中添加的数据全部在控制台输出第2部分:从现有数据源构 建数据集非连接环境下构建数据集的过程什么是DataAdapter?使用DataAdapter填充数据集使用DataAda pter更新数据源本节内容非连接环境下构建数据集的过程什么是DataAdapter?使用DataAdapter填充数据 集使用DataAdapter更新数据源非连接环境下构建数据集的过程在非连接的环境中,当处理数据时,资源无需保持在服务器端 1.连接到SQLServer2.提交查询命令3.保存查询结果到DataSet4.关闭连接5.处理DataSet中的数据 6.重建连接,将DataSet中的更新提交回SQLServer本节内容非连接环境下构建数据集的过程什么是DataAdapte r?使用DataAdapter填充数据集使用DataAdapter更新数据源配置DataAdapter以检索信息什么是 DataAdapter?XxxDataAdapter对象模型DataAdapter类的属性和方法创建使用SELECT语句的 DataAdapter什么是DataAdapter?定义DataSet驻留在内存中,必须要与数据源(物理数据库)进行交互。 DataAdapter就是二者之间的桥梁一方面负责将数据从数据源填充到DataSet中;另一方面负责将DataSet中 的更新提交回数据源DataAdapter--桥梁数据填充与更新的桥梁工具DataAdapter类的属性和方法DataAda pter的主要属性SelectCommand用于从数据源中检索数据InsertCommand插入指定 数据到数据源中UpdateCommand对数据源中数据进行更新DeleteCommand删除数据源中的指定数 据DataAdapter的主要方法Fill(dataset)使用SelectCommand命令查询数据并填充d atasetUpdate(dataset)使用其他Command命令将dataset的数据更新到数据源FillSchem a将DataTable添加到DataSet中,并配置架构以匹配数据源中的架构。本节内容非连接环境下构建数据集 的过程什么是DataAdapter?使用DataAdapter填充数据集使用DataAdapter更新数据源使用Dat aAdapter填充DataSetDataAdapter.Fill(dataSet)使用SelectCommand查询数据源 根据查询结果自动构造DataSet结构,包括DataTable,DataColumn等。将查询数据加载进DataSet,即Da taTable中的DataRow演示演示:使用DataAdapter填充DataSet1创建SqlDataAdapter 并使用Fill方法填充DataSet(注意:Fill方法有多种使用方法,参考MSDN)2使用上次课程的PrintRow方法输 出所有的数据读取数据集&数据表中的数据说明1当DataSet为空结构时,Fill方法自动构建完整的DataSet。但它仅 使用数据源中的表列和表行来填充DataSet;虽然约束通常由数据源来设置,但在默认情况下,Fill方法不会将此架构信息添加到 DataSet中。2如果一个DataSet有多张表,每张表应该使用一个单独的DataAdapter进行填充3此示例中所 示的代码不显式打开和关闭Connection。如果Fill方法发现连接尚未打开,它将隐式地打开DataAdapter正 在使用的Connection。如果Fill已打开连接,它还将在Fill完成时关闭连接。当处理单一操作(如Fill 或Update)时,这可以简化代码。4如果执行多项需要打开连接的操作,则可以通过以下方式提高应用程序的性能:显式调用Co nnection的Open方法,对数据源执行操作,然后调用Connection的Close方法。应尝试保持与数据源 的连接打开的时间尽可能短,以便释放资源供其他客户端应用程序使用使用DataAdapter填充DataTable为了对特定的数据 表进行数据填充,可用Fill方法的其他形式:Fill(DataSet,String),特别指明所要填充的DataTable 的名称Fill(DataSet,Int32,Int32,String)原型:Fill(DataSetdataS et,intstartRecord,intmaxRecords,stringsrcTable)使用限定的记录数目来填 充指定的DataTable其他过程与填充DataSet的方式类似演示:填充2个数据表分别填充Customers,Orde rs数据表将带参数的查询命令用于DataAdapter在学习SqlCommand时,我们用到了带参数的查询语句,例如 :selectCustomerID,CompanyNamefromCustomersWHERECustomerI D=@CID问题:将带参数的查询命令与DataAdapter结合,将指定参数的数据填充到数据集中演示演示:将带参数的查 询命令用于DataAdapter参考代码本节内容非连接环境下构建数据集的过程什么是DataAdapter?使用Data Adapter填充数据集使用DataAdapter更新数据源使用DataAdapter更新数据源在非连接环境下,更新 数据源的关键机制是使用DataAdapter回顾:填充数据集,需要使用DataAdapter的Fill()方法更新数据源 ,将使用DataAdapter的Update()方法对比连接环境下,使用Command的ExecuteNonQuery()方法 更新数据源使用Update方法处理数据源更新数据源更新包括以下3种基本操作:INSERT、UPDATE、DELETE 当调用Update方法时,DataAdapter将分析已作出的更改并执行相应的命令(INSERT、UPDATE或DEL ETE)。具体来说:当DataAdapter遇到对DataRow的更改时,它将使用InsertCommand、Upda teCommand或DeleteCommand3种属性来处理该更改。使用Update方法处理数据源更新例1:Cat egories表第1行的CategoryName列值被修改DataRowrow=dataSet.Tables["Categ ories"].Rows[0];row["CategoryName"]="NewCategory";dataAdp ater.Update(dataSet,"Categories");此时,Update方法将使用UpdateCommand命 令来处理该更新使用Update方法处理数据源更新例2:Categories表增加了1行新数据dataSet.Tables ["Categories"].Rows.Add(newObject[]{1,"ado.net"});dataAdpa ter.Update(dataSet,"Categories");此时,Update方法将使用InsertCommand命令 来处理该更新使用Update方法处理数据源更新例3:Categories表删除了1行新数据DataRowrow=d ataSet.Tables["Categories"].Rows[0];row.Delete();dataAdpater. Update(dataSet,"Categories");此时,Update方法将使用DeleteCommand命令来处理该 更新创建数据更新命令DataAdapter不会自动生成3种数据更新命令(属性)InsertCommand、UpdateCom mand、DeleteCommand。如果调用了Update但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。创建数据更新命令的方法:1.显式设置数据更新命令2.利用Command Builder对象自动生成1.显式设置数据更新命令前面的例子1.创建数据更新命令并设置参数updateComma nd=newSqlCommand("UpdateCustomerssetCompanyName=@C NamewhereCustomerID=@CID");2.设置DataAdapter的UpdateCommand属性 :dataAdpater.UpdateCommand=updateCommand;3.数据改变并且需要更新数据源时,使用 Update方法,将自动选择UpdateCommand进行更新dataAdpater.Update("Customers") ;演示:显式设置数据更新命令1.填充数据集2.更新数据3.检查更新代码演示演示:显式设置数据更新命令2.利 用CommandBuilder对象自动生成数据更新命令1.为了自动生成命令,必须设置DataAdapter的Selec tCommand属性2.SelectCommand查询中还必须返回至少一个主键或唯一列。3.为了返回构造INSE RT、UPDATE和DELETESQL命令所必需的元数据,DbCommandBuilder必须执行SelectComm and。额外经历一次到数据源的查询过程,这可能会降低性能。若要实现最佳性能,最好主动指定命令而不是使用DbCommandBu ilder。4.当与DataAdapter关联时,CommandBuilder将自动生成DataAdapter的I nsertCommand、UpdateCommand和DeleteCommand属性(如果它们是空引用)。如果已存在用于某属 性的Command,则将使用现有Command。自动生成命令的规则下表显示创建自动生成命令的规则。演示:利用Com mandBuilder对象自动生成数据更新命令思考题1.这2种各有什么优点和缺点?2.比较利用DataAdapter 的Update()方法与利用Command的ExecuteNonQuery()方法,二者更新数据源的效率有何差别?3.根据非 连接环境下的数据更新操作过程,你是如何理解前面关于数据状态和数据版本的内容?第3部分:创建简单的Windows数据应用程序创 建简单的Windows数据应用程序创建简单的Windows数据应用程序在Windows窗体上显示数据库中的数据。通过将 项从“数据源”窗口拖动到窗体上,可以在Windows应用程序中的窗体上显示数据。演示演示:创建简单的数据应用程序步骤( 本向导以Northwind数据库为示例):1创建Windows应用程序。命名为NorthwindWinApp2 使用数据源配置向导,基于Northwind数据库中的Customers和Orders表在应用程序中创建和配置数据集。 3添加控件以显示Customers表中的数据。4添加控件以基于所选的Customer显示Orders。5通过选 择不同的客户并验证是否能正确显示所选客户的订单来测试应用程序。数据源配置向导--创建数据源在“数据”菜单上单击“显示数据源”。 在“数据源”窗口中,单击“添加新数据源”,启动“数据源配置向导”。在“选择数据源类型”页面上选择“数据库”,然后单击“下一步” 。在“选择您的数据连接”页面上执行下列操作之一:如果下拉列表中包含到Northwind示例数据库的数据连接,请选择该连接 。或:选择“新建连接”,以启动“添加/修改连接”对话框。如果数据库需要密码,请选择该选项以包括敏感数据,再单击“下一步”。在 “将连接字符串保存到应用程序配置文件”页面上单击“下一步”。在“选择数据库对象”页面上展开“表”节点。选择“Customers ”和“Orders”表,然后单击“完成”。“NorthwindDataSet”被添加到您的项目中,并且在“数据源”窗口中出现“C ustomers”和“Orders”表。back创建控件以显示客户数据(父记录)在“数据源”窗口中,选择“Customer s”表,然后单击下拉箭头。从“Customer”表的控件列表中选择“Details”。将主“Customers”节点从“数据源 ”窗口拖到“Form1”上。带有描述性标签的数据绑定控件会出现在窗体上,同时还显示一个工具条(BindingNavigator),用于在记录间进行导航。组件栏(下方)中出现NorthwindDataSet、CustomersTableAdapter、BindingSource和BindingNavigator。back创建控件以显示每个客户的订单(子记录)在“数据源”窗口中,展开“Customers”节点并选择“Customers”表中的最后一列(为“Fax”列下方的可展开的“Orders”节点),然后将其拖到“Form1”的底部。(“Customers”表层次结构中的此节点表示客户的相关订单,这与主“Orders”节点相反,后者表示Orders表中的所有订单,而不是单个客户的订单。)一个DataGridView被添加到窗体,且一个新的BindingSource组件(“OrdersBindingSource”)和TableAdapter(“OrdersTableAdapter”)被添加到组件栏。back测试应用程序按F5。选择不同的客户以验证窗体上的网格中显示的订单是否正确。backDataSetDataSet在非连接环境下的数据存取SchoolofComputerScience&Engineering,ZSC在非连接环境下的数据存取SchoolofComputerScience&Engineering,ZSC |
|