版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、教学目标:通过本节学习,要让学生掌握DataAdapter、DataSet以及DataView等对象的属性、方法和事件,能够进行简单的数据库访问操作。通过讲授和学生的动手练习,使学生了解VB。Net的数据库编程的一些常用技巧。教学类型:在多媒体教室直观讲授,引导学生进行简单的数据库操作程序设计操作。教学内容:7.6 DataAdapter 对象在.NET框架中,DataAdapter对象可以从中央数据源移动数据到本地DataSet,也可以使DataSet产生的改变返回到数据源,它使用.NET管理支持程序的Connection对象连接数据源,并使用Command对象获取数据。DataAdapte
2、r实际上减弱DataSet对象对实际数据源的影响, 如果要通过“数据”工具箱中的控件来创建DataAdapter对象,可参照下面的操作步骤。(1)在当前窗体中创建一个Connection对象,例如,SqlConnection1。(2)从“数据”工具箱中选择一个DataAdapter控件,例如,SqlDataAdapter控件。然后单击窗体,在创建一个SqlDataAdapter对象的同时打开“数据适配器配置向导”对话框,该向导可以指定连接以及数据适配器,用以选择记录并处理数据库更改的命令。(3)打开“数据适配器配置向导”对话框,选择“数据适配器应使用哪一种数据连接”下拉列表框中选择一个已经存在
3、于当前数据连接列表中的连接。(4)确认选择的连接之后,打开“选择查询类型”对话框。通过选择单选按钮,可以确定数据适配器如何访问数据库。可以指定一个Select语句来加载数据,向导将生成Insert,Update和Delete语句,以保存数据更改。(5)选择访问数据库的访问方式之后,在中间的文本框中手动输入SQL Select语句,或者单击“查询生成器”按钮利用查询生成器来创建查询语句。 (6)数据适配器配置完成之后,可以设置SqlDataAdapter1的默认属性,并可以通过下面的超级链接重新配置适配器、生成DataSet和预览DataSet中的数据。DataAdapter的SelectCom
4、mand属性是一个用于获取数据源中数据的Command对象。DataAdapter的InsertCommand,UpdateCommand和DeleteCommand属性是根据DataSet中对数据的改变来更新数据源中数据的Command对象。DataAdapter的Fill方法用于处理含有DataAdapter中SelectCommand的结果值的DataSet,它也添加或刷新DataSet中的行以匹配数据源中的行。如果要通过代码来创建DataSet,并通过DataGrid对象来显示数据,可通过“Windows窗体”工具箱中的控件在当前窗体中创建一个DataGrid对象和一个Button对象
5、。其中,DataGrid对象的名称为DataGrid1,然后双击按钮对象,打开代码设计器,在其事件过程中输入下面的代码:Dim ds As New DataSet() SqlDataAdapter1.Fill(ds, "Products") DataGrid1.DataSource = ds保存创建的内容后执行程序,出现窗体之后,单击按钮对象可以查看相应的数据。有关DataSet的创建和显示将在后面进行更加详细的介绍。7.7 DataSet DataSet是一个完整的包含表、约束、表之间关系的数据集合,并让一个小的关系数据库驻留内存。它提供了一个与数据源无关的相容关系编程模
6、型。DataSet对象中的每个表都包含一个列集合,它们代表了DataSet的模式。每个表都有多个行,表示这个DataSet所保持的数据。这些行记得它们的初始状态和当前状态,以便DataSet可以跟踪发生了何种改变。其类的结构如图7.14所示:DataSetDataViewDataTableDataColumnDataColumnDataRowDataRelationConstraint图7.14 DataSet类的结构当在一个企业解决方案的不同组件间传递数据时,DataSet提供了一个丰富的对象模型。例如,在代表性的解决方案中,一个客户应用程序通过URL请求数据。当请求到达适当的中间层组件时,
7、将使用适配器创建一个DataSet。然后,这个DataSet被转换为一个XML文档,传送回请求者。在客户应用程序上,使用控件组合来显示这些数据,如DataGrid(数据网格)。用户可以对数据进行添加、删除和编辑等操作,直到自己满意。当准备完毕时,DataSet再一次被转换为XML文档,传送回服务器组件。该组件将XML文档转换为DataSet,然后使用适配器将改变的数据合并回DBMS中。如图7.15所示。如果发生任何冲突,服务器组件可以使用内置的商务规则对它们进行调整。经过调整的DataSet返回客户后可以被合并到现有的DataSet中,用户可以重新开始使用反映最新版本的DataSet工作。图
8、7.15 利用DataSet进行数据传递的过程通常有两种方法来使用DataSet:非类型化数据集与类型化数据集。非类型化数据集没有相应的内置架构(表和列结构)。用户可以通过DataSet控件或编程来创建一个DataSet,然后给其添加DataTable对象,再创建DataRelation对象将每个表连接起来。当运行时需要创建一个DataSet来捕获应用程序生成的数据时,可以使用编程方法。类型化数据集先是从基类 DataSet 派生,然后使用“数据集设计器”中的信息(存储在 .xsd 文件中)生成一个新的强类型数据集类。在应用程序中既可以使用类型化数据集也可以使用非类型化数据集。不过,.NET对
9、类型化数据集提供了更多工具支持,而且使用类型化数据集进行编程不仅更加简单,而且不易出错。7.7.1 DataSet的结构DataSet的关系结构和功能是在Tables,Columns,Constraints和Relations集合中进行描述。其中,表的布局包括数据类型等信息,放在Tables和Columns中,特定表的约束放在Constraints中,表之间的关系放在Relations中。1DataTableDataTable是包含内存中数据的一个表,它有一个Columns集合,其中包含表的模式。DataTable还包含DataRow对象的一个Rows集合,每个DataRow对象代表一个数据记
10、录。2DataColumnDataColumn表示DataTable中一个字段的模式元素。DataColumn对象的DataType属性可以包含列的数据类型,列的行为方式可以用AllowNull,Unique和ReadOnly等属性来设置。DataColumn可以设置为新行的列自动插入一个递增的值,类似于SQLServer的Identity列或Access中的Counter字段。AutoIncrement属性可以打开这个功能,AutoIncrementSeed和AutoIncrementStep属性控制这个值从哪个数开始,以及递增的方式。大多数列都包含类似的数据值,列也可以设置为包含一个表达式
11、,根据其他列来计算一个值。3DataRow与仅包含模式信息的DataColumn相反,DataRow包含实际的数据值。DataRow类的Item属性以列名建立索引(从列的DataColumn对象中提取列名)。如果一个DataColumn对象的名称是FirstName,则对于DataRow类来说,FirstName列中的值可以用下面的代码来提取:sFirstName=MyDataRow.Item("FirstName")Item属性是DataRow的默认属性,也是一个索引属性,因此,可以将其省略。另外,列也可以通过它们的数字索引来访问。如果在DataTable中,FirstN
12、ame的DataColumn的数字索引是4,就可以使用下述代码:sFirstName=MyDataRow(4)要在DataTable中添加新行,NewRow方法用返回一个引用该新行的对象,然后在行中的每个字段(列)中插入数据。NewRow方法会自动在Rows集合中添加新行。要修改行中的数据,只需访问列,并设置其中的值即可。对于小的应用程序来说,这是改变DataTable的最简单的方式。例如,下面的代码可以为FirstName列填充数据:MyDataRow("FirstName")=sFirstNameDataRow类的一个最重要的功能是可以显示某一行中数据的不同版本。在编辑
13、和提交对行的改变时,开发人员可以根据数据的版本来决定如何操作。在DataRow中数据的版本可以包括:Current:行上的当前数据,就是最后一次接受或拒绝对行的改变。Default:行上的源默认值,这些值在使用DataTable的NewRow方法创建后就在该行上。Original:当表第一次添加到DataSet上时行中的数据,或者在DataTable上最后一次执行AcceptChanges后行上的数据。Proposed:行上有一些没有使用DataTable的AcceptChanges提交的新数据,或单个DataRow上的新数据。这些数据都可以用DataTable或DataRow的RejectC
14、hanges方法回执,返回其原来的值。在任何时候,行中都可以有多个版本的数据,即给定的行可以显示有数据的Original版本、Current版本和Proposed版本。对于行上的一列,每个版本的值都是使用Item属性的一个可选参数获得的。例如,要获得FirstName列的Proposed值,可以使用下面的代码:sFirstName=MyDataRow("FirstName",DataRowVersion.Proposed)但是,这会产生一个错误,因为被请求的数据版本在行上不存在。要知道行上的数据有什么可用的版本,可以使用DataRow的HasVersion方法。数据的某个版
15、本不存在的情况非常多。下面的代码查找一行,看看其中是否有Proposed版本的新数据。如果该行的FirstName字段上有Proposed版本的与行上源数据不同的新数据,就接受改变。但如果FirstName中的Proposed数据与源数据相同,就取消编辑。If MyRow.HasVersion(DataRowVersion.Proposed) ThenIf MyRow ("FirstName", DataRowVersion.Current) = MyRow("FirstName", _DataRowVersion .Proposed) ThenMsgB
16、ox("FirstName is unchanged - edit cancelled")MyRow.CancelEditElseMyRow.AcceptChangesEnd IfElseMsgBox("Row has no proposed data")End If4ConstraintDataTable的Constraints集合包含一组对象,描述了如何处理DataTable中数据的约束。目前有两个约束类:ForeignKeyConstraint和UniqueConstraint。其中,ForeignKeyConstraint对象必须使用下述元素设置
17、:外键所指的相关DataTable。包含DataTable中的外键的列,这个外键包含了约束。如果违背了约束,应采取的操作。另一种约束类是UniqueContstraint,它比较简单,只需要设置DataTable中的列即可。不过,该列必须包含与UniqueContraint约束相关的惟一的值。5DataRelationRelations集合中的每个DataRelation对象都包含DataSet的Tables集合中两个DataTables的链接信息。指定每个表中用于链接的列,就可以链接DataTables,非常类似于在指定关系数据库的关系时把主键和外键关联起来。典型的关系是父子关系,例如在Sq
18、l Server的事例数据库Northwind中,父Customers表与子Orders表的关联。Customers表中的每一行在Orders表中可以有0个、一个或多个相关记录。以下代码示例使用 DataSet 中的两个 DataTable 对象来创建一个 DataRelation。每个 DataTable 包含一个名为 CustID 的列,它必须有相同的数据类型。用作两个 DataTable 对象之间的链接。该示例将单个 DataRelation 添加到 DataSet 的 Relations 集合中。该示例中的第一个参数指定所创建的 DataRelation 的名称。第二个参数设置父 Da
19、taColumn,第三个参数设置子 DataColumn。customerOrders.Relations.Add("CustOrders",customerOrders.Tables("Customers").Columns("CustID"), customerOrders.Tables("Orders").Columns("CustID")7.7.2 DataSet的创建1非类型化数据集创建非类型化数据集,完全不依赖于任何数据库服务器。既可以通过工具箱中的DataSet控件来可视化地创建D
20、ataSet。也可以编码创建DataSet。如果通过手工编码来创建非类型化数据集,可以直接将代码输入到代码设计器中。例如,下面的代码创建了一个简单的DataSet,在其中添加一个表,然后在表中添加两个列:'创建一个DataSet对象Dim MyDataSet As New DataSet(ManualDataSet)'创建一个 DataTable 并添加到 DataSet 中Dim tblDataTable As New DataTable("SampleTable")MyDataSet.Tables.Add(tblDataTable)'为表创建两个
21、 column 并建立它们的属性,然后将属性添加到 Columns 集合中Dim colDataColumn1 As New DataColumn("FirstColumn")colDataColumn1.DataType = System.Type.GetType("System.String")colDataColumn1.DefaultValue = "Default"tblDataTable.Columns.Add(colDataColumn1)Dim colDataColumn2 As New DataColumn(&quo
22、t;SecondColumn")colDataColumn2.DataType = System.Type.GetType("System.Int32")tblDataTable.Columns.Add(colDataColumn2)'创建一个 DataRow 并添加到表中,然后设置它的属性Dim rowMyDataRow As DataRowrowMyDataRow = MyDataSet.Tables("SampleTable").NewRowMyDataSet.Tables("SampleTable").Row
23、s.Add(rowMyDataRow)rowMyDataRow("FirstColumn") = "New text"rowMyDataRow("SecondColumn") = 10000MyDataSet.AcceptChanges()'遍历各行并显示对应的值Dim rowDataRow As DataRowFor Each rowDataRow In MyDataSet.Tables("SampleTable").RowsMsgBox(rowDataRow.Item("FirstColumn
24、").ToString & "-" & CStr(rowDataRow _("SecondColumn"),"Show data")Next从注释中可以看出,上面这段代码开始时创建一个新DataSet,其名称是ManualDataSet,再创建一个新DataTable,名称是SampleTable,并把它添加到DataSet中。此时表中没有任何列。接下来,为DataTable创建两个列,并设置它们的属性。给第一列设置的Default实际上是可选的,但可以作为一个例子包含进去。实际上,必须为列设置的惟一属性是D
25、ataType。创建和初始化每个列后,就把它们添加到名为SampleTable的DataTable的Columns集合中。在创建一个DataRow之后,利用For语句遍历Rows集合并显示每行上两个列的值。如果运行这段代码,结果应是在一个消息框中显示Newtext10000字符串。这样,就可以对DataSet进行任何操作。2创建类型化数据集需要在程序运行时动态创建DataSet的时候,使用手工编码的方式是非常方便的。但是这种方式只适合具有少量数据的DataSet,如果需要处理大量数据,只能通过数据库来创建DataSet。从前面的内容可以知道,VB.NET通过管理支持程序和对应的几个对象以及控件
26、,使用户能够可视化地通过数据库来创建DataSet,不必被繁杂的代码或设置所困扰。(1)利用“数据”工具箱中的Connection控件创建一个数据库连接,例如选择SqlConnection控件,创建一个SQL数据库连接。(2)利用新建的SQL数据库连接创建一个SqlDataAdapter对象(名称为SqlDataAdapter1),并配置适配器,选择需要的数据表和查询语句。(3)在SqlDataAdapter1控件上的“SqlDataAdapter任务”窗口中,单击“生成数据集”超级链接,可打开“生成数据集”对话框,如图7.21所示。如果数据库需要用户账号,在此操作中还会打开一个对话框要求输入
27、用户账号和密码,才允许访问数据库并生成数据集。(4)选择“新建”单选按钮,并在其后的文本框中输入新的DataSet的名称,例如,DataSet1。然后在“选择要添加到数据集中的表”列表框中启用要添加到DataSet中的表。如果要将新建的数据集添加到设计器中,可启用“将此数据集添加到设计器”复选框,然后单击“确定”按钮即完成DataSet的创建。通过数据库创建数据集之后,打开数据集的“属性”窗口,如图7.22所示。通过该属性窗口可以设置DataSet的一些常用属性,并可以查看DataSet的构架和详细属性。如果要查看DataSet的构架,单击“查看构架”超级链接,可打开DataSet的构架文件(
28、扩展名为.xsd,例如DataSet1.xsd)来显示构架。 7.7.3 DataSet的数据预览通过数据库创建DataSet之后,就可以供应用程序处理和显示。不过,为了保证数据库连接和DataSet生成的正确性,VB.NET提供了DataSet的预览功能。通过它,开发人员可以在使用DataSet之前预览DataSet中的内容。要预览通过数据库生成的DataSet,可打开当前窗体的快捷菜单或DataAdapter对象的“SqlDataAdapter任务”窗口,然后单击“预览数据”超级链接,可打开“数据适配器预览”对话框,如图7.23所示。通过该对话框,可以预览当前应用程序中的所有数据适配器(D
29、ataSetCommand对象)中的DataSet及其具体内容。如果“结果”列表框中显示的内容没有问题,则DataSet对象被正确地创建。7.8 DataView的使用DataView对象类似于SQL Server数据库中的视图功能,提供对DataTable的检视、列排序、过滤记录以及记录的搜索。DataView对象常常被Windows窗体或Web窗体控件数据绑定(DataBinding),而且能够在不同的控件中同时提供同一数据的多个视图。DataView的使用,增加了ADO.NET在数据应用上的灵活性。为指定的DataTable创建一个新的DataView,可以声明该DataView,并把D
30、ataTable的一个引用传送给DataView构造函数,代码如下:Dim MyNewDataView As New DataView(MyDataSet.Tables("Customers")在第一次创建DataView时,DataView默认为DataSet中的所有行。利用属性可以在DataView中得到数据行的一个子集,或者给这些行排序。这些属性可以随时修改,动态改变DataSet的输出。7.8.1取得DefaultView属性在DataSet中,DataTable提供了一个DefaultView属性,该属性可以获取包括排序、筛选和搜索等自定义的视图。例如下面的代码:
31、Dim dv As New DataView()SqlDataAdapter1.Fill(DataSet11, "Products") dv = DataSet11.Tables("Products").DefaultView DataGrid1.DataSource = dv上面的代码先创建一个名为dv的DataView对象,然后从DataSet11中取得Products,并通过DefaultView将内容返回给默认的DataView,最后,通过DataGrid1控件来接收并显示数据。7.8.2 条件过滤要通过条件过滤来获取数据的子集,一般利用Data
32、View的RowFilter和RowStateFilter属性来实现。RowFilter属性用于提供过滤表达式,例如下面的代码可以取出FirstName列为Anny的记录:MyNewDataView.RowFilter="FirstName='Anny'"如果要进行模糊条件设置,可使用Like、*和%等字符。例如,在为Customers表定义的DataView中,可以把DataView设置为只返回公司名以字母A开头的客户,代码如下:MyNewDataView.RowFilter= "CompanyName Like 'A*' &qu
33、ot;RowFilter表达式可以非常复杂,也可以包含涉及多个行的数据、常数的算术计算和比较。例如,可以在过滤条件中使用and和or等操作数。RowStateFilter属性与RowFilter属性有所不同,它定义了从DataTable中提取特定DataSet的值,表7.6所示为RowStateFilter可用的值及其说明。RowStateFilter的值可以以各种形式合并使用,方法是在设置RowStateFilter属性时把它们加在一起。例如,下面的代码就让DataView只显示新行和已删除的行:MyNewDataView.RowStateFilter=DataViewRowState.Ne
34、w+DataViewRowState.Deleted表7.6 RowStateFilter 可用的值设 置说 明CurrentRows显示当前行,包括未改变的行、新行和已修改的行当前行,但不显示已删除的行Deleted显示已删除的行。注意,如果使用了DataTable或DataView的Delete方法删除了某一行,该行才被认为已删除。从Rows集合中删除行,不会把这些行标记为已删除。ModifiedCurrent显示带有当前版本的数据的行,这些数据不同于该行中的原数据ModifiedOriginal显示已修改的行,但显示数据的原版本(即使数据行已被改变,其中已有另一个当前版本的数据,也是这样
35、)。注意,这些行中当前版本的数据可以用ModifiedCurrent设置来提取New显示新行,这些行是用DataView的AddNew方法添加的None不显示任何行,在用户选择显示选项前,可以使用这个设置来初始化控件的DataViewOriginalRows显示所有带有源数据版本的行,包括未改变的行和已删除的行Unchanged显示未修改的行7.8.3 列排序DataView的Sort属性带一个描述排序的字符串,可以在一个或多个列上进行排序,每个列可以按升序或降序来排列。指定排序的字符串应包含一个列名,后面可以有表示升序的ASC或表示降序的DESC,默认是升序。对于多列排序,该字符串应在第一个
36、列名后有一个逗号,其后是另一个列名和ASC或DESC。其中,列的个数可以按需要确定。例如,下面的代码先按单价(unitPrice)对DataView中的行进行升序排序,然后在给定的相同单价中,再按照库存量(Stocks)进行降序排序。MyNewDataView.Sort="unitPrice ASC , Stocks DESC"7.8.4 使用DataView控件在“数据”工具箱中,有一个DataView控件。通过它,开发人员可以快速地创建DataView对象,并可视化地设置过滤条件、排序方式和要操作的表等属性。在DataView控件的“属性”对话框中,有8个常用属性,它们
37、的设置说明如表7.7所示。表7.7 DataView控件的常用属性属 性说 明AllowDelete设置当前DataView,以及与之关联的用户界面是否允许删除AllowEdit设置当前DataView,以及与之关联的用户界面是否允许编辑AllowNew设置当前DataView,以及与之关联的用户界面是否允许添加新行ApplyDefaultSort设置是否应用默认的排序方式RowFilter设置用于筛选当前DataView返回的数据的表达式RowStateFiler设置当前DataView返回的数据的版本Sort设置当前DataView返回数据的排序方式Table设置当前DataView要返回
38、数据的DataSet的表(当前应用程序中的所有DataSet及其表都列在该属性后面的下拉列表框中)7.9 控件与数据绑定利用ADO.NET连接数据库并创建DataSet,主要是为了显示和操作数据库中的数据。要在应用程序中实现数据的显示和操作,则必须将数据与窗体中的控件绑定起来,通过控件来显示和处理数据。VB.NET中的控件有多种,有些控件一次可以显示一条记录的一列,例如TextBox和Label等。对于它们的数据绑定是简单的控件数据绑定,利用Bindings集合来指定绑定的属性、数据来源和列。另外一些控件可以显示多条记录,例如DataGrid,ListBox和ComboBox等控件。对于它们的
39、数据绑定是复杂的控件数据绑定,利用DataSource属性来指定数据源。7.9.1 简单的数据绑定对于TextBox和Label等控件,一次只能显示出一个记录的一列。如果需要他们来显示和处理数据,就只能使用Bindings进行简单数据绑定。绑定时一个集合对象代表一个控件的多个属性,可以与不同数据来源的列绑定。不过,要注意列与属性的特征是否相符合。简单数据绑定的语法如下:控件.Bindings.Add("Property",DataSource,"DataMember")在上面的参数中,Property(属性)可以设置控件的任何属性,如Text,DataSource(数据源)是指DataTable,DataView,DataSet或者一组数组变量,DataMember(数据成员)用来设置某
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025湖南永州陆港枢纽投资发展集团有限公司招聘4人备考核心试题附答案解析
- 店面转卖协议书
- 寒假工打工协议书
- 农商展期合同范本
- 质押物品协议书
- 舞台修建协议书
- 业务自律协议书
- 兼职协议正式合同
- 证券保密协议书
- 自愿私了协议书
- 2025~2026学年上海市闵行区莘松中学八年级上学期期中语文试卷
- 医院拟就业协议书
- 2026届四川南充市高考一诊地理试卷试题(含答案详解)
- 某图书馆应急救援体系研究
- 《淳安县养老服务设施布局专项规划(2022-2035年)》
- DZ/T 0426-2023 固体矿产地质调查规范(1:50000)(正式版)
- 麻醉科临床技术操作规范2023版
- 消防系统瘫痪应急处置方案
- GB/T 11417.5-2012眼科光学接触镜第5部分:光学性能试验方法
- 《寝室夜话》(4人)年会晚会搞笑小品剧本台词
- 开放大学土木工程力学(本)模拟题(1-3)答案
评论
0/150
提交评论