一、特点介绍
> 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 方法完成相同的任务。