ADO.NET读书笔记系列之------DataSet对象

一、特点介绍

> 1、处理脱机数据,在多层应用程序中很有用。 > > 2、可以在任何时候查看DataSet 中任意行的内容,允许修改查询结果的方法。 > > 3、处理分级数据 > > 4、缓存更改 > > 5、XML的完整性:DataSet 对象和XML文档几乎是可互换的。

二、使用介绍

> 1、创建DataSet 对象: DataSet ds = new DataSet("DataSetName"); > > 2、查看调用 SqlDataAdapter.Fill 创建的结构 > > da.Fill(ds,"Orders"); > > DataTable tbl = ds.Table[0]; > > foreach(DataColumn col in tbl.Columns) > > Console.WriteLine(col.ColumnName); > > 3、查看 SqlDataAdapter 返回的数据 > >> ①、DataRow 对象 >> >> DataTable tbl = ds.Table[0]; >> >> DataRow row = tbl.Row[0]; >> >> Console.WriteLine(ros["OrderID"]); >> >> ②、检查存储在DataRow 中的数据 >> >> DataTable tbl = row.Table; >> >> foreach(DataColumn col in tbl.Columns) >> >> Console.WriteLine(row[col]); >> >> ③、检查DatTable 中的 DataRow 对象 > > foreach(DataRow row in tbl.Rows) > > DisplayRow(row); > > 4、校验 DataSet 中的数据 > >> ① 、校验 DataColumn 的属性: ReadOnly,AllowDBNull,MaxLength,Unique >> >> ②、DataTable 对象的 Constrains 集合: UiqueConstraints,Primarykey,ForeignkeyConstraints >> >> 通常不必刻意去创建 ForeignkeyConstraints, 因为当在 DataSet 的两个 DataTable 对象之间创建关系时会创建一个。 >> >> ③、用SqlDataAdapter.Fill 模式来检索模式信息 > > 5、编写代码创建 DataTable 对象 > >> ① 、创建 DataTable 对象 :DataTable tbl = new DataTable("TableName"); >> >> ②、将DataTable 添加到 DataSet 对象的 Table 集合 >> >> DataSet ds = new DataSet(); >> >> DataTable tbl = new DataTable("Customers"); >> >> ds.Tables.Add(tbl); >> >> DataSet ds = new DataSet(); >> >> DataTable tbl = ds.Tables.Add("Customers"); >> >> DataTable 对象只能存在于至多一个 DataSet 对象中。如果希望将 DataTable 添加到多个 DataSet 中,就必须使用 Copy 方法或 Clone 方法。 Copy 方法创建一个与原 DataTable 结构相同并且包含相同行的新 DataTable ; Clone 方法创建一个与原 DataTable 结构相同,但没有包含任何行的新 DataTable 。 >> >> ③、为DataTable 添加列 >> >> DataTable tbl = ds.Tables.Add("Orders"); >> >> DataColumn col =tbl.Columns.Add("OrderID",typeof(int)); >> >> col.AllowDBNull = false; >> >> col.MaxLength = 5; >> >> col.Unique = true; >> >> tbl.PrimaryKey = new DataColumn[]{tbl.Columns["CustomersID"]}; >> >> 当设置主键时, AllowDBNull 自动设置为 False; >> >> ④ 、 处理自动增量列 >> >> DataSet ds = new DataSet(); >> >> DataTable tbl = ds.Tables.Add("Orders"); >> >> DataColumn col = tbl.Columns.Add("OrderID",typeof(int)); >> >> col.AutoIncrement = true; >> >> col.AutoIncrementSeed = -1; >> >> col.AutoIncrementStep = -1; >> >> col.ReadOnly = true; >> >> ⑤、添加基于表达式的列 >> >> tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice"); > > 6、修改 DataTable 内容 > >> ① 、添加新 DataRow >> >> DataRow row = ds.Tables["Customers"].NewRow(); >> >> row["CustomerID"] = "ALFKI"; >> >> ds.Tables["Customers"].Rows.Add(row); >> >> object[] aValues ={"ALFKI","Alfreds","Anders","030-22222"}; >> >> da.Tables["Customers"].LoadDataRow(aValues,false); >> >> ② 、修改当前行 >> >> 修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用 SqlDataAdapter 对象来提交交给数据库的待定的更改。 >> >> DataRow rowCustomer; >> >> rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON"); >> >> if(rowCustomer == null) >> >> // 没有查找客户 >> >> else >> >> { >> >> rowCustomer["CompanyName"] ="NewCompanyName"; >> >> rowCustomer["ContactName"] ="NewContactName"; >> >> } >> >> // 推荐使用这种方式 >> >> DataRow rowCustomer; >> >> rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON"); >> >> if(rowCustomer == null) >> >> // 没有查找客户 >> >> else >> >> { >> >> rowCustomer.BeginEdit(); >> >> rowCustomer["CompanyName"] ="NewCompanyName"; >> >> rowCustomer["ContactName"] ="NewContactName"; >> >> rowCustomer.EndEdit(); >> >> } >> >> //null表示不修改该列的数据 >> >> obejct[] aCustomer ={null,"NewCompanyName","NewContactName",null} >> >> DataRow rowCustomer; >> >> rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); >> >> rowCustomer.ItemArray = aCustomer; >> >> ③、处理DataRow 的空值 >> >> // 查看是否为空 >> >> DataRow rowCustomer; >> >> rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); >> >> if(rowCustomer.IsNull("Phone")) >> >> Console.WriteLine("It's Null"); >> >> else >> >> Console.WriteLine("It's not Null"); >> >> //赋予空值 >> >> rowCustomer["Phone"] = DBNull.Value; >> >> ④ 、删除 DataRow >> >> DataRow rowCustomer; >> >> rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); >> >> rowCustomer.Delete(); >> >> ⑤ 、清除 DataRow >> >> DataRow rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); >> >> rowCustomer.ItemArray = aCustomer; >> >> da.Tables["Customers"].Remove(rowCustomer); >> >> 或者 >> >> ds.Tables["Customers"].RemoveAt(intIndex); >> >> ⑥ 、使用 DataRow.RowState 属性 : Unchanged,Detached,Added,Modified,Deleted >> >>> private void DemonstrateRowState() >>> >>>> {
> // Run a function to create a DataTable with one column.
> DataTable myTable = MakeTable();
> DataRow myRow;
>
> // Create a new DataRow.
> myRow = myTable.NewRow();
> // Detached row.
> Console.WriteLine("New Row " + myRow.RowState);
>
> myTable.Rows.Add(myRow);
> // New row.
> Console.WriteLine("AddRow " + myRow.RowState);
>
> myTable.AcceptChanges();
> // Unchanged row.
> Console.WriteLine("AcceptChanges " + myRow.RowState);
>
> myRow["FirstName"] = "Scott";
> // Modified row.
> Console.WriteLine("Modified " + myRow.RowState);
>
> myRow.Delete();
> // Deleted row.
> Console.WriteLine("Deleted " + myRow.RowState);
> } >> >> ⑦ 、检查 DataRow 中的挂起更改 >> >> DataRow rowCustomer; >> >> rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI"); >> >> rowCustomer["CompanyName"] = "NewCompanyName"; >> >> string strNewCompanyName,strOldCompanyName; >> >> Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Current]); >> >> Console.WriteLine(rowCustomer["CompanyName",DataRowVersion.Original]);

三、属性方法事件介绍

> 1 、 DataSet > >> ① 、属性 >> >> CaseSensitive: 用于控制 DataTable 中的字符串比较是否区分大小写。 >> >> DataSetName: 当前 DataSet 的名称。如果不指定,则该属性值设置为 "NewDataSet" 。如果将 DataSet 内容写入XML文件, DataSetName 是XML文件的根节点名称。 >> >> DesignMode: 如果在设计时使用组件中的 DataSet , DesignMode 返回 True ,否则返回 False 。 >> >> HasErrors: 表示 DataSet 中的 DataRow 对象是否包含错误。如果将一批更改提交给数据库并将 DataAdapter 对象的 ContinueUpdateOnError 属性设置为 True ,则在提交更改后必须检查 DataSet 的 HasErrors 属性,以确定是否有更新失败。 >> >> NameSpace 和 Prefix: 指定XML命名空间和前缀 >> >> Relations: 返回一个 DataRelationCollection 对象。 >> >> Tables: 检查现有的 DataTable 对象。通过索引访问 DataTable 有更好的性能。 >> >> ②、方法 >> >> AcceptChanges 和 RejectChanges: 接受或放弃 DataSet 中所有挂起更改。调用 AcceptChanges 时, RowState 属性值为 Added 或 Modified 的所有行的 RowState 属性都将被设置为 UnChanged. 任何标记为 Deleted 的 DataRow 对象将从 DataSet 中删除。调用 RejectChanges 时,任何标记为 Added 的 DataRow 对象将会被从 DataSet 中删除,其他修改过的 DatRow 对象将返回前一状态。 >> >> Clear: 清除 DataSet 中所有 DataRow 对象。该方法比释放一个 DataSet 然后再创建一个相同结构的新 DataSet 要快。 >> >> Clone 和 Copy:使用Copy 方法会创建与原 DataSet 具有相同结构和相同行的新 DataSet 。使用 Clone 方法会创建具有相同结构的新 DataSet ,但不包含任何行。 >> >> GetChanges: 返回与原 DataSet 对象具有相同结构的新 DataSet ,并且还包含原 DataSet 中所有挂起更改的行。 >> >> GetXml 和 GetXmlSchema: 使用 GetXml 方法得到由 DataSet 的内容与她的架构信息转换为 XML 格式后的字符串。如果只希望返回架构信息,可以使用 GetXmlSchema 。 >> >> HasChange: 表示 DataSet 中是否包含挂起更改的 DataRow 对象。 >> >> Merge: 从另一个 DataSet 、 DataTable 或现有 DataSet 中的一组 DataRow 对象载入数据。 >> >> ReadXml 和 WriteXml:使用ReadXml 方法从文件、 TextReader 、数据流或者 XmlReader 中将 XML 数据载入 DataSet 中。 >> >> Reset: 将 DataSet 返回为未初始化状态。如果想放弃现有 DataSet 并且开始处理新的 DataSet ,使用 Reset 方法比创建一个 DataSet 的新实例好。 >> >> ③、事件 >> >> MergeFailed: 在 DataSet 的 Merge 方法发生一个异常时触发。 > > 2、 DataTable > >> ① 、属性 >> >> ②、方法 >> >> ③、事件 >> >> ColumnChanged: 在列的内容被改变之后触发 >> >> ColumnChangding: 在列的内容被改变之前触发 >> >> RowChanged,RowChanging,RowDeleted,RowDeleting 。 > > 3、 DataColumn > >> ① 、属性 > > 4 、 DataRow > >> ① 、属性 >> >> HasError: 确定行是否包含错误。 >> >> Item: 通过指定行的列数,列的名称或 DataColumn 对象本身,访问列的内容。 >> >> ItemArray: 获取或设置行中所有列的值。 >> >> RowError: 返回一个包含行错误信息的字符串。 >> >> RowState: 返回 DataRowState 枚举中的值来表示行的当前状态。 >> >> Table: 返回 DataRow 对象所在的 DataTable 。 >> >> ②、方法 >> >> AcceptChanges 和 RejectChanges: 提交和放弃挂起更改。 >> >> BeginEdit 、 CancelEdit 、 EndEdit >> >> ClearErrors: 清除 DataRow 中所有的错误。 >> >> Delete:Delete 方法实际上并不从 DataRow 表的 Row 集合中删除该 DataRow 。当调用 DataRow 对象的 Delete 方法时, ADO.NET 将该行标记为删除,之后调用 SqlDataAdapter 对象的 Update 方法来删除其在数据库中对应的行。 >> >> 如果希望彻底删除 DataRow ,可以调用 Delete 方法,接着再调用它的 AccepteChanges 方法 , 还可以使用 DataRowCollection 对象的 Remove 方法完成相同的任务。

Published At
Categories with 数据库类
comments powered by Disqus