资源预览内容
第1页 / 共45页
第2页 / 共45页
第3页 / 共45页
第4页 / 共45页
第5页 / 共45页
第6页 / 共45页
第7页 / 共45页
第8页 / 共45页
第9页 / 共45页
第10页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
非连接环境下的应用程序EmployeesOrdersCustomersProductsCategoriesCategoriesProductsSqlDataAdapterOleDbDataAdapterSQL Server 2000CustomersOrdersSQL Server 6.5数据集数据集XML Web ServiceXmlDataDocumentXML 文档文档数据集数据集在断开缓存中存储数据。数据集的结构类似于关系数据库的结构;它公开表、行和列的分层对象模型。另外,它包含为数据集定义的约束和关系。注意注意如果想要在断开与数据源的连接时使用一组表和行,则使用数据集。对于设计数据访问,使用数据集并非总是最佳的解决方案。数据集的基本组成部分通过标准编程构造:DataSet类包含数据表的Tables集合和DataRelation对象的Relations集合。DataTable类包含表行的Rows集合、数据列的Columns集合和数据关系的ChildRelations和ParentRelations集合。DataRow类包含RowState属性,该属性的值指示自数据表首次从数据库加载后,行是否已更改以及是如何更改的。RowState属性的可能值包括Deleted、Modified、New和Unchanged。DataSet、DataTable和DataColumn的概念服务器数据源数据库连接存储过程DataSetDataTableDataTable数据行数据行数据列数据列数据表数据表数据关联数据关联约束约束数据集、架构和XMLADO.NET数据集是以XML形式表示的数据视图,是一种数据关系视图。在VisualStudio和.NETFramework中,XML是存储和传输各种数据时所用的格式。因此,数据集与XML有密切关系。数据集和XML之间的这种关系使数据集有以下功能:数据集的结构(表、列、关系和约束)可在XML架构中定义。XML架构是W3C(万维网联合会)的基于标准的格式,用于定义XML数据的结构。数据集可以使用ReadXmlSchema和WriteXmlSchema方法读写存储结构化信息的架构。如果无架构可用,数据集可以从通过关系方法结构化的XML文档中的数据推导(通过其InferXmlSchema方法)出一个。可以生成一个数据集类,在此类中并入架构信息以将其数据结构(如表和列)定义为类成员。可以使用数据集的ReadXML方法将XML文档或流读入数据集,使用数据集的WriteXML方法将数据集以XML格式写出。因为XML是不同应用程序之间的标准数据交换格式,这意味着可以加载其他应用程序发送的包含XML格式信息的数据集。同样,数据集可以将其数据集写出为XML流或文档,以与其他应用程序共享或只是将其存储为标准格式。可以创建数据集内容的XML视图(XMLDataDocument对象),然后用关系方法(通过数据集)或XML方法查看和操作数据。这两种视图在更改时自动同步。创建数据集DataSet构造函数publicDataSet();publicDataSet(string);protectedDataSet(SerializationInfo,StreamingContext);参数:参数:stringdataSetName:DataSet的名称。 SerializationInfo info:将对象序列化或反序列化所需的数据。StreamingContext context:给定序列化流的源和目的地。可以通过调用DataSet构造函数来创建DataSet的实例。例DataSetmyDataSet=newDataSet();DataSetcustDS=newDataSet(CustomerOrders);数据集的大小写敏感性在数据集中,默认情况下表和列的名称不区分大小写,即数据集中名为“Customers”的表也可能是指“customers”。这符合包括SQLServer在内的许多数据库的命名规则,即数据元素的名称无法通过大小写区分。 注意注意与数据集不同,XML文档区分大小写,因此架构中定义的数据元素的名称区分大小写。例如,架构协议允许要包含的架构定义名为“Customers”的表和名为“customers”的另一个不同的表。这在架构用于生成数据集类时会导致名称冲突。不过,大小写敏感性可以成为决定数据在数据集中的解释方法的因素。例如,在数据集表中筛选数据时,根据比较是否区分大小写,搜索判据可能返回不同的结果。通过设置数据集的CaseSensitive属性,可以控制筛选、搜索和排序是否区分大小写。默认情况下,数据集中的所有表都继承此属性的值。(对于每个单独的表可以重写此属性。)DataSet属性CaseSensitive:获取或设置一个值,该值指示DataTable对象中的字符串比较是否区分大小写。Container:(从MarshalByValueComponent继承)获取组件的容器。DataSetName:获取或设置当前DataSet的名称。DefaultViewManager:获取DataSet所包含的数据的自定义视图,以允许使用自定义的DataViewManager进行筛选、搜索和导航。DesignMode:(从MarshalByValueComponent继承)获取指示组件当前是否处于设计模式的值。EnforceConstraints:获取或设置一个值,该值指示在尝试执行任何更新操作时是否遵循约束规则。ExtendedProperties:获取与DataSet相关的自定义用户信息的集合。HasErrors:获取一个值,指示在此DataSet中的任何DataTable对象中是否存在错误。Locale:获取或设置用于比较表中字符串的区域设置信息。Namespace:获取或设置DataSet的命名空间。Prefix:获取或设置一个XML前缀,该前缀是DataSet的命名空间的别名。Relations:获取用于将表链接起来并允许从父表浏览到子表的关系的集合。Site:获取或设置DataSet的System.ComponentModel.ISite。Tables:获取包含在DataSet中的表的集合。DataSet方法AcceptChanges:提交自加载此DataSet或上次调用AcceptChanges以来对DataSet:进行的所有更改Clear:通过移除所有表中的所有行来清除任何数据的DataSetClone:复制DataSet的结构,包括所有DataTable架构、关系和约束。不复制任何数据Copy:复制DataSet的结构和数据GetChanges:获取DataSet的副本,该副本包含自上次加载以来或自调用AcceptChanges:以来对该数据集进行的所有更改GetXml:返回存储在DataSet中的数据的XML表示形式GetXmlSchema:返回存储在DataSet中的数据的XML表示形式的XSD架构Merge:将指定的DataSet、DataTable或DataRow对象的数组合并到当前的DataSet或DataTable中ReadXml:将XML架构和数据读入DataSetReadXmlSchema:将XML架构读入DataSetReset:将DataSet重置为其初始状态。子类应重写Reset,以便将DataSet还原到其原始状态AcceptChanges方法DataSetmyDataSet;myDataSet=newDataSet();/.DataTablet;t=myDataSet.TablesSuppliers;/创建一个新数据行.DataRowmyRow;myRow=t.NewRow();myRowCompanyID=NWTRADECO;myRowCompanyName=NortWestTradeCompany;/将新行加入数据表中.t.Rows.Add(myRow);/调用AcceptChanges方法,数据集中所以对象接受更改.myDataSet.AcceptChanges();Clear方法privatevoidClearDataSet(DataSetmyDataSet)/打印出表的行数.foreach(DataTabletinmyDataSet.Tables)Console.WriteLine(t.TableName+Rows.Count=+t.Rows.Count.ToString();/清除表中所有行.myDataSet.Clear();/再次打印行数.foreach(DataTabletinmyDataSet.Tables)Console.WriteLine(t.TableName+Rows.Count=+t.Rows.Count.ToString();Clone方法:privatevoidGetClone(DataSetmyDataSet)/对原数据集克隆.DataSetcloneSet;cloneSet=myDataSet.Clone();/其他操作代码.Copy方法:privatevoidCopyDataSet(DataSetmyDataSet)/建立拷贝对象.DataSetcopyDataSet;copyDataSet=myDataSet.Copy();/其他代码.GetXml、GetXmlSchema方法privatestaticvoidDemonstrateGetXml()/创建一个数据集,数据集有一个含有两列的表.DataSetds=newDataSet(myDataSet);DataTablet=ds.Tables.Add(Items);t.Columns.Add(id,typeof(int);t.Columns.Add(Item,typeof(string);/增加十行.DataRowr;for(inti=0;i10;i+)r=t.NewRow();rid=i;rItem=Item+i;t.Rows.Add(r);/将数据集中的内容以XML形式显示.Console.WriteLine(ds.GetXml();/以XML形式显示数据集的构架.Console.WriteLine(ds.GetXmlSchema();DataSet对象事件Disposed:(从MarshalByValueComponent继承)添加事件处理程序以侦听组件上的Disposed事件。MergeFailed:当Merge方法发生异常时发生。事件使用:DataSetds=newDataSet(myDataSet);ds.MergeFailed+=newMergeFailedEventHandler(Merge_Failed);privatestaticvoidMerge_Failed(objectsender,MergeFailedEventArgse)Console.WriteLine(Merge_FailedEvent:0,e.Conflict);DataTableDataTable是ADO.NET库中的核心对象。当访问DataTable对象时,注意它们是按条件区分大小写的。例如,如果一个DataTable被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。如果正在以编程方式创建DataTable,则必须先通过将DataColumn对象添加到DataColumnCollection(通过Columns属性访问)中来定义其架构若要向DataTable中添加行,必须先使用NewRow方法返回新的DataRow对象。DataTable可存储的最大行数是16,777,216创建DataTableDataTable表示一个内存内关系数据的表,可以独立创建和使用,也可以由其他.NETFramework对象使用,最常见的情况是作为DataSet的成员使用。DataTable对象可通过使用DataTable构造函数来创建,或者可通过将构造函数参数传递到DataSet的Tables属性的Add方法(它是一个DataTableCollection)来创建。DataTable对象可通过使用DataAdapter对象的Fill方法或FillSchema方法在DataSet内创建,或者可使用DataSet的ReadXml、ReadXmlSchema或InferXmlSchema方法从预定义的或推断的XML架构中创建。请注意,将一个DataTable作为成员添加到一个DataSet的Tables集合中后,不能再将其添加到任何其他DataSet的表集合中。最初创建DataTable时,它是没有架构(结构)的。要定义表的架构,必须创建DataColumn对象并将其添加到表的Columns集合中。也可以为表定义主键列,并且可以创建Constraint对象并将其添加到表的Constraints集合中。在为DataTable定义了架构之后,可通过将DataRow对象添加到表的Rows集合中来将数据行添加到表。创建DataTable时,不需要为TableName属性提供值,可以在其他时间指定属性,或者将其保留为空。但是,在将一个没有TableName值的表添加到DataSet中时,该表会得到一个从“Table”(表示Table0)开始递增的默认名称TableN。注意建议在提供TableName值时避免使用“Table”或“TableN”的命名约定,因为那样提供的名称可能与DataSet中现有的默认表名称冲突。如果提供的名称已经存在,将引发异常。创建DataTable以下示例创建DataTable对象的实例,并为其指定名称“Customers”。DataTableworkTable=newDataTable(Customers);以下示例创建DataTable实例,方法是:将其添加到DataSet的Tables集合中。DataSetcustDS=newDataSet();DataTablecustTable=custDS.Tables.Add(CustTable);创建DataTable例:通过DataColumn和DataRow创建数据表DataTablemyDataTable=newDataTable(“myDataTable);DataColumnmyDataColumn;DataRowmyDataRow;/CreatefirstcolumnandaddtotheDataTable.myDataColumn=newDataColumn();myDataColumn.DataType=System.Type.GetType(System.Int32);myDataColumn.ColumnName=ChildID;myDataColumn.AutoIncrement=true;myDataColumn.Caption=ID;myDataColumn.ReadOnly=true;myDataColumn.Unique=true;/AddthecolumntotheDataColumnCollection.myDataTable.Columns.Add(myDataColumn);myDataSet.Tables.Add(myDataTable);/CreatethreesetsofDataRowobjects,fiverowseach,andaddtoDataTable.for(inti=0;i=4;i+)myDataRow=myDataTable.NewRow();myDataRowchildID=i;myDataTable.Rows.Add(myDataRow);DataTable属性CaseSensitive:指示表中的字符串比较是否区分大小写。Columns:获取属于该表的列的集合。Constraints获取由该表维护的约束的集合。DataSet:获取该表所属的DataSet。PrimaryKey:获取或设置充当数据表主键的列的数组Rows:获取属于该表的行的集合。TableName:获取或设置DataTable的名称。DataTable方法AcceptChanges提交自上次调用AcceptChanges以来对该表进行的所有更改。BeginInit初始化。在运行时发生。BeginLoadData在加载数据时关闭通知、索引维护和约束。Clear清除所有数据的DataTable。Clone克隆DataTable的结构,包括所有DataTable架构和约束。Compute计算用来传递筛选条件的当前行上的给定表达式。Copy复制该DataTable的结构和数据。EndInit结束初始化。此初始化在运行时发生。EndLoadData在加载数据后打开通知、索引维护和约束。Equals(从Object继承)已重载。确定两个Object实例是否相等。DataTable方法GetChanges已重载。获取DataTable的副本,该副本包含自上次加载以来或自调用AcceptChanges以来对该数据集进行的所有更改。GetErrors获取包含错误的DataRow对象的数组。GetType(从Object继承)获取当前实例的Type。ImportRow将DataRow复制到DataTable中,保留任何属性设置以及初始值和当前值。LoadDataRow查找和更新特定行。如果找不到任何匹配行,则使用给定值创建新行。NewRow创建与该表具有相同架构的新DataRow。RejectChanges回滚自该表加载以来或上次调用AcceptChanges以来对该表进行的所有更改。Reset将DataTable重置为其初始状态。Select已重载。获取DataRow对象的数组。DataTable对象事件ColumnChanged:在DataRow中指定的DataColumn的值被更改后发生。ColumnChanging:在DataRow中指定的DataColumn的值发生更改时发生。Disposed:(从MarshalByValueComponent继承)添加事件处理程序以侦听组件上的Disposed事件。RowChanged:在成功更改DataRow之后发生。RowChanging:在DataRow正在更改时发生。RowDeleted:在表中的行已被删除后发生。RowDeleting:在表中的行要被删除之前发生。例:创建4个事件:OnColumnChanged、OnColumnChanging、OnRowChanged和OnRowChanging。这些事件中的每一个都在列或行更改时发生workTable.ColumnChanged+=newDataColumnChangeEventHandler(OnColumnChanged);workTable.ColumnChanging+=newDataColumnChangeEventHandler(OnColumnChanging);workTable.RowChanged+=newDataRowChangeEventHandler(OnRowChanged);workTable.RowChanging+=newDataRowChangeEventHandler(OnRowChanging);使用DataTable对象事件使用DataTable对象事件protectedstaticvoidOnColumnChanged(objectsender,DataColumnChangeEventArgsargs)Console.Write(ColumnChanged:);Console.Write(args.Column.ColumnName+changedto+args.ProposedValue+n);protectedstaticvoidOnColumnChanging(objectsender,DataColumnChangeEventArgsargs)Console.Write(ColumnChanging:);Console.Write(args.Column.ColumnName+equals+args.Rowargs.Column+,changingto+args.ProposedValue+n);protectedstaticvoidOnRowChanging(objectsender,DataRowChangeEventArgsargs)if(args.Action!=DataRowAction.Nothing)Console.WriteLine(RowChanging:Action=+args.Action+,CustID=+args.RowCustID);protectedstaticvoidOnRowChanged(objectsender,DataRowChangeEventArgsargs)if(args.Action!=DataRowAction.Nothing)Console.WriteLine(RowChanged:Action=+args.Action+,CustID=+args.RowCustID);DataColumnDataColumn构造函数publicDataColumn();publicDataColumn(string);publicDataColumn(string,Type);publicDataColumn(string,Type,string);publicDataColumn(string,Type,string,MappingType);参数:1.columnName:一个字符串,它表示要创建的列的名称。如果设置为空引用(VisualBasic中为Nothing)或空字符串(),则当添加到列集合中时,将提供一个默认名称。2.dataType:支持的DataType。3.Expr:用于创建该列的表达式。4.Type:MappingType值之一。例:显示如何使用DataColumn构造函数的一个重载版本privatevoidCreateComputedColumn(DataTablemyTable)System.TypemyDataType;myDataType=System.Type.GetType(System.Decimal);stringstrExpr;/“Price”列的值乘以“Quantity”列的值得到“Total”列.strExpr=Price*Quantity;/创建列.DataColumnmyColumn=newDataColumn(Total,myDataType,strExpr,MappingType.Attribute);/设置其他属性.myColumn.AutoIncrement=false;myColumn.ReadOnly=true;/将列加入到一个数据表对象的数据列集合(DataColumnCollection).DataSet1.TablesOrderDetails.Columns.Add(myColumn);DataColumn属性Caption获取或设置列的标题。ColumnName获取或设置DataColumnCollection中的列的名称。DataType获取或设置存储在列中的数据的类型。DefaultValue在创建新行时获取或设置列的默认值。Expression获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。ExtendedProperties获取与DataColumn相关的自定义用户信息的集合。MaxLength获取或设置文本列的最大长度。Namespace获取或设置DataColumn的命名空间。Ordinal获取列在DataColumnCollection集合中的位置。Prefix获取或设置一个XML前缀,该前缀是DataTable的命名空间的别名。ReadOnly获取或设置一个值,指示一旦向表中添加了行,列是否还允许更改。Site(从MarshalByValueComponent继承)获取或设置组件的位置。Table获取列所属的DataTable。Unique获取或设置一个值,指示列的每一行中的值是否必须是唯一的。DataColumn方法Dispose:(从MarshalByValueComponent继承)已重载。释放由MarshalByValueComponent使用的资源。Equals:(从Object继承)已重载。确定两个Object实例是否相等。GetHashCode:(从Object继承)用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。GetService:(从MarshalByValueComponent继承)获取IServiceProvider的实施者。GetType:(从Object继承)获取当前实例的Type。ToString:已重写。获取列的Expression(如果存在的话)。DataRowDataRow和DataColumn对象是DataTable的主要组件。使用DataRow对象及其属性和方法检索、评估、插入、删除和更新DataTable中的值。若要创建新的DataRow,使用DataTable对象的NewRow方法。创建新的DataRow之后,使用Add方法将新的DataRow添加到DataRowCollection中。最后,调用DataTable对象的AcceptChanges方法以确认是否已添加。可通过调用DataRowCollection的Remove方法或调用DataRow对象的Delete方法,从DataRowCollection中删除DataRow。Remove方法将行从集合中移除。与此相反,Delete标记要移除的DataRow。在调用AcceptChanges方法时发生实际移除。通过调用Delete,可在实际删除行之前以编程方式检查哪些行被标记为移除。DataRow属性HasErrors:获取一个值,该值指示某行是否有错。Item:已重载。获取或设置存储在指定列中的数据。在C#中,该属性为DataRow类的索引器。ItemArray:通过数组获取或设置此行的所有值。RowError:获取或设置行的自定义错误说明。RowState:获取该行与它和DataRowCollection的关系相关的当前状态。Table:获取该行拥有其架构的DataTable。DataRow属性Table:获取该行拥有其架构的DataTableprivatevoidGetTable(DataRowmyRow)/获取数据行所在的数据表DataTablemyTable=myRow.Table;/打印表中每一列的数据类型foreach(DataColumndcinmyTable.Columns)Console.WriteLine(dc.DataType);DataRow方法AcceptChanges:提交自上次调用AcceptChanges以来对该行进行的所有更改。BeginEdit:对DataRow对象开始编辑操作。CancelEdit:取消对该行的当前编辑。ClearErrors:清除该行的错误,包括RowError和用SetColumnError设置的错误。Delete:删除DataRow。EndEdit:终止发生在该行的编辑。Equals:(从Object继承)已重载。确定两个Object实例是否相等。GetChildRows:已重载。获取DataRow的子行。GetColumnError:已重载。获取列的错误说明。GetColumnsInError:获取包含错误的列的数组。GetParentRow:已重载。获取DataRow的父行。GetParentRows:已重载。获取DataRow的父行。GetType:(从Object继承)获取当前实例的Type。HasVersion:获取一个值,该值指示指定版本是否存在。IsNull:已重载。获取一个值,该值指示指定列是否包含空值。RejectChanges:拒绝自上次调用AcceptChanges以来对该行进行的所有更改。SetColumnError:已重载。为列设置错误说明。BeginEdit方法使用BeginEdit方法将DataRow置于编辑模式。在该模式中,事件被临时挂起,以便允许用户在不触发验证规则的情况下对多行进行多处更改。例如,如果需要确保总数列的值等于行中借贷列的值,则可以将每一行都置入编辑模式,以便在用户尝试提交值之前挂起对行值的验证。BeginEdit方法在用户更改数据绑定控件的值时被隐式调用;EndEdit方法在调用DataTable对象的AcceptChanges方法时被隐式调用。当处于该编辑模式时,DataRow存储原始值和新建议值的表示形式。因此,只要尚未调用EndEdit方法,就可以通过传递Item属性的version参数的DataRowVersion.Original或DataRowVersion.Proposed来检索原始版本或建议版本。此时,还可通过调用CancelEdit方法取消任何编辑。若要查看行中是否包含原始值或建议值,请调用HasVersion方法。foreach(DataRowmyRowint.Rows)myRow.BeginEdit();myRow0=(int)myRow0+10;Console.Write(tOriginalt+myRow0,DataRowVersion.Original);Console.Write(tProposedt+myRow0,DataRowVersion.Proposed+n);Console.WriteLine(n);/接受更改t.AcceptChanges();/在调用BeginEdit后修改两行的值t.Rows0.BeginEdit();t.Rows1.BeginEdit();t.Rows00=100;t.Rows10=100;try/调用EndEdit.t.Rows0.EndEdit();t.Rows1.EndEdit();catch(Exceptione)/处理异常和返回值.System.Diagnostics.EventLoglog=newSystem.Diagnostics.EventLog();log.Source=MyApplication;log.WriteEntry(e.ToString();Console.WriteLine(Exceptionoftype0occurred.,e.GetType();/创建一个表,有两列,十行.DataTablemyTable=newDataTable(myTable);/创建列DataColumnc1=newDataColumn(id,Type.GetType(System.Int32);c1.AutoIncrement=true;DataColumnc2=newDataColumn(item,Type.GetType(System.String);myTable.Columns.Add(c1);myTable.Columns.Add(c2);/添加十行.DataRownewRow;for(inti=0;i10;i+)newRow=myTable.NewRow();newRowitem=Item+i;myTable.Rows.Add(newRow);myTable.AcceptChanges();/建立表的数据视图.DataRowCollectionrc=myTable.Rows;rc0.Delete();rc2.Delete();myTable.AcceptChanges();填充数据集数据集是容器,因此需要用数据填充它。填充数据集时,将引发各种事件,应用约束检查,等等。可以用多种方法填充数据集:调用数据适配器的Fill方法。这导致适配器执行SQL语句或存储过程,然后将结果填充到数据集中的表中。如果数据集包含多个表,每个表可能有单独的数据适配器,因此必须分别调用每个适配器的Fill方法。通过创建DataRow对象并将它们添加到表的Rows集合,手动填充数据集中的表。(只能在运行时执行此操作,无法在设计时设置Rows集合。)有关更多信息,请参见将数据添至表中。将XML文档或流读入数据集。合并(复制)另一个数据集的内容。如果应用程序从不同的来源(例如,不同的XMLWebservices)获取数据集,但是需要将它们合并为一个数据集,该方案会很有用。填充数据集调用DataAdapter对象的Fill方法,将结果返回到DataSet中例:stringstrcon,strsql;strcon=DataSource=(local);+database=Northwind;+IntegratedSecurity=sspi;strsql=SELECTorderID,CustomerID,EmployeeID,OrderDateFROMOrders;SqlDataAdapterda=newSqlDataAdapter(strsql,strcon);DataSetds=newDataSet();da.Fill(ds,Orders);数据集中的记录位置和导航因为数据集是完全断开的数据容器,所以数据集(与ADO记录集不同)不需要或不支持当前记录的概念。相反,数据集中的所有记录都可用。由于没有当前记录,因此就没有指向当前记录的特定属性,也没有从一个记录移动到另一个记录的方法或属性。(比较而言,ADO记录集支持绝对记录位置和从一个记录移动到另一个记录的方法。)可以访问数据集中以对象形式出现的各个表;每个表公开一个行集合。可以像处理任何集合那样处理行集合,通过集合的索引访问行,或者用编程语言通过集合特定的语句来访问行。注意注意如果将Windows窗体中的控件绑定到数据集,则可以使用窗体的绑定结构简化对个别记录的访问。相关表和DataRelation对象如果数据集中有多个表,这些表中的信息可能是相关的。数据集没有这些关系的继承知识,因此为了使用相关表中的数据,可以创建DataRelation对象来描述数据集中表之间的关系。可使用DataRelation对象以编程方式获取父记录的相关子记录和从子记录获取父记录。例如,顾客和订单数据,如Northwind数据库中的情形。“Customers”表可能包含如下记录:CustomerIDCompanyNameCityALFKIAlfredsFutterkisteBerlinANTONAntonioMorenoTaquerias MexicoD.F.AROUTAroundtheHornLondon数据集也可能包含另一个含有订单信息的表。“Orders”表包含外键列形式的CustomerID。只选择“Orders”表中的某些列,可能类似于以下内容:OrderIdCustomerIDOrderDate10692ALFKI10/03/199710702ALFKI10/13/199710365ANTON11/27/199610507ANTON4/15/1997因为每个顾客可以有一个以上的订单,所以在顾客和订单之间存在一对多关系。在上表中,顾客ALFKI有两个订单。可以用DataRelation对象从子表或父表获取相关记录。例如,当使用描述顾客ANTON的记录时,可以获取描述该顾客的订单的记录集合。同样,如果使用描述订单号10507的记录,则可以使用DataRelation对象获取描述此订单的顾客(ANTON)的记录。约束与大多数数据库一样,数据集也支持约束,作为一种确保数据完整性的方法。约束是在表中插入、更新或删除行时应用的规则。可以定义两种类型的约束:1.唯一约束,检查列中的新值在表中是否是唯一的。2.外键约束,定义当主表中的记录被更新或删除时相关子记录应如何更新的规则。在数据集中,约束与单个表(外键约束)或列(唯一约束,即保证列值具有唯一性的约束)关联。约束作为类型UniqueConstraint或ForeignKeyConstraint的对象实现。然后它们被添加到表的Constraints集合。另外,也可以通过只是将数据列的Unique属性设置为true来指定唯一约束。数据集本身支持布尔型EnforceConstraints属性,该属性指定是否强制约束。默认情况下,该属性设置为true。不过,有时暂时关闭约束很有用。最常见的情形是当更改记录过程中所采用的方式将暂时导致无效状态时。完成更改(并由此返回有效状态)后,可以重新启用约束。在VisualStudio中,定义数据集时会隐式创建约束。通过将主键添加到数据集,即会为主键列隐式创建一个唯一约束。通过将其他列的Unique属性设置为true,可以为它们指定唯一约束。通过在数据集中创建DataRelation对象来创建外键约束。除了允许以编程方式获取有关相关记录的信息外,DataRelation对象还允许定义外键约束规则。数据访问策略建议ADO.NET假定一个用于数据访问的模型:在其中打开一个连接,获取数据或执行操作,然后关闭该连接。ADO.NET为使用此模型提供两个基本的策略。1.一个模型是在数据集中存储数据,这是断开与数据源的连接时可以使用的记录的内存中缓存。若要使用一个数据集,可以创建该数据集的实例,然后使用数据适配器从数据源填充它。然后可以使用数据集内的数据,例如,通过将控件绑定到数据集成员。2.另一个策略是直接对数据库执行操作。在此模型中,可使用包含SQL语句或对存储过程的引用的数据命令对象。然后可以打开一个连接,执行命令以执行操作,接着关闭连接。如果该命令返回结果集(即如果该命令执行Select语句),则可以使用数据读取器获取数据,数据读取器的功能类似于高效的只读游标。数据读取器然后作为数据绑定的来源。每一策略都具有特定的优点,应基于数据访问要求选择策略。将数据存储在数据集内VisualStudio.NET应用程序中数据访问的常见模型是在数据集中存储数据并使用数据适配器读取和写入数据库中的数据。数据集模型的优越性有:使用多个表使用多个表一个数据集可以包含多个结果表,它将这些表作为离散对象维护。可以单独使用这些表或作为父子表在它们之间导航。操作来自多个源的数据操作来自多个源的数据数据集内的表可表示来自多个不同源的数据,例如来自不同数据库、XML文件、电子表格等的数据,都可出现在同一个数据集中。数据在数据集内以后,可以操作数据并以同种格式关联数据,就好像它们来自单个源。在分布式应用程序中的层间移动数据在分布式应用程序中的层间移动数据通过在数据集内保存数据,可以方便地将它在应用程序的表示层、业务层和数据层之间移动。与其他应用程序进行数据交换与其他应用程序进行数据交换数据集提供一种功能强大的数据交换方式,它可以与应用程序的其他组件以及其他应用程序交换数据。数据集包含对许多功能的广泛支持,如将数据序列化为XML和读写XML架构。数据绑定数据绑定如果正在使用窗体,将控件绑定到数据集内的数据通常比执行命令后以编程方式将数据值加载到控件方便。维护记录以供重复使用维护记录以供重复使用通过数据集,无需再次查询数据库即可重复使用相同的记录。使用数据集功能,可以对记录进行筛选和排序,并且可以将数据集用作数据源(如果正在分页)。便于编程便于编程当使用数据集时,可以生成一个将其结构表示为对象的类文件(例如,数据集内的Customers表可以作为dataset.Customers对象访问)。这使得用它编程更容易、更清楚也更不易出错,并且受到智能感知、“数据适配器配置向导”等VisualStudio工具的支持。直接执行数据库操作还可以直接与数据库交互。在此模型中,可使用包含SQL语句或对存储过程的引用的数据命令对象。然后可以执行命令以执行该操作。如果该命令返回结果集(即如果该命令执行Select语句),则可以使用数据读取器获取数据,数据读取器的功能类似于高效的只读游标。1.安全说明安全说明当使用CommandType属性设置为Text的数据命令时,请对从客户端发送过来的信息进行仔细检查,然后再将它传递给数据库。恶意用户可能会试图发送(插入)修改过的或其他SQL语句,以获得未经授权的访问或破坏数据库。在将用户输入内容传输到数据库之前,应始终确认这些信息是有效的。如果可能的话,请始终使用参数化查询或存储过程,这是最佳措施。直接执行数据库操作具有特定的优点,这些优点包括:1.额外功能额外功能如前所述,有一些操作只能通过执行数据命令完成,如执行DDL命令。2.对执行的更多的控制对执行的更多的控制通过使用命令和数据读取器(如果正读取数据),可以对如何和何时执行SQL语句或存储过程以及哪些将成为结果或返回值进行更多的控制。3.更少的系统开销更少的系统开销通过直接在数据库中读写,可以不必在数据集内存储数据。由于数据集需要内存,因此可以减少应用程序中的一些系统开销。当打算只使用数据一次(如在Web页中显示搜索结果)时尤其如此。在这种情况下,显示数据时可能不需要创建和填充数据集这一步。4.某些情况下编程更少某些情况下编程更少在少数情况下(尤其是Web应用程序),保存数据集状态需要额外编程。例如,在“Web窗体”页中,每个往返过程都重新创建页面;除非添加编程来保存和还原数据集,否则每个往返过程也都会放弃并重新创建数据集。如果使用数据读取器直接从数据库读取,则可以避免管理数据集所需的额外步骤。访问数据建议Web 窗体窗体通常是使用数据命令;若要获取数据,则使用数据读取器。因为每次Web窗体页进行往返过程时都重新创建该页及其控件和组件,所以每次都创建并填充数据集通常是效率低下的,除非还想要在往返过程间将数据集放入缓存。在以下情况下使用数据集:想要使用多个单独的表或来自不同数据源的表。正与其他应用程序或诸如XMLWebservices之类的组件交换数据。需要通过从数据库获取的每一记录进行全面的处理。如果使用数据命令和数据读取器,则一边读取每一记录一边处理它可能导致连接长期保持打开状态,这可能影响应用程序的性能和可缩放性。如果数据处理涉及相互依赖的记录(例如,在相关表中查找信息)。如果想要执行XML操作,例如数据上的XSLT转换。如果喜欢数据集所提供的简便的编程方式。访问数据建议XML Web servicesXMLWebservices是ASP.NETWeb应用程序,因此使用与Web窗体页相同的模型:每次对其进行调用时创建和放弃XMLWebservices。这暗示XMLWebservices的数据访问模型大体上与用于Web窗体的数据访问模型相同。但是,XMLWebservices通常是中间层对象,并且其主要用途通常是与Web上的其他应用程序交换数据。在以下情况下使用数据集:XMLWebservices发送和接收数据;例如,将数据作为方法的返回值发送并将数据作为方法参数接收。这在XMLWebservices中是基本选择;即使出于其他原因可以考虑使用数据命令,但与其他组件的数据交换几乎始终意味着应使用数据集。出于上面列出的适合于Web窗体的任何原因。在以下情况下请使用数据命令(并在适当时使用数据读取器):XMLWebservices正检索标量值。XMLWebservices正执行非查询操作,例如DDL命令。XMLWebservices正调用存储过程以在数据库内执行逻辑。访问数据建议Windows 窗体窗体一般而言,在Windows窗体中使用数据集。Windows窗体通常用于胖客户端,在其中每一用户操作不创建和放弃窗体(及其数据),这与Web窗体相同。Windows窗体应用程序传统上还提供有益于维护记录缓存(例如逐一在窗体中显示记录)的数据访问方案。具体而言,在以下情况下请使用数据集:如果正重复使用相同的记录,例如允许用户在记录间导航。如果正使用Windows窗体数据绑定结构,该结构是为使用数据集而专门设计的。出于在上面的Web窗体下列出的其他任何原因。在以下情况下请使用数据命令(并在适当时使用数据读取器):如果正从数据库获取标量值如果正执行非查询操作,如DDL命令。如果正在获取只读数据以显示在窗体中,例如,创建报表。另需注意的是,如果不需要在访问数据后保持数据可用,则使用数据命令。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号