【ADO.NET】脱机数据处理-DataSet对象

1. DataSet 对象
l          与SqlDataReader 对象对比
SqlDataReader是一种获取查询结果快速高效的结构,仅支持向前单向读取查询结果,且其中数据为只读。DataSet支持循环来回滚动查看查询结果,并支持排序、搜索、缓存修改数据等功能。
l          DataSet对象成员
DataSet包含DataTable对象和DataRelation对象。DataTable对象包括DataRow、DataColumn和Constraint对象。
2. DataTable 对象
       DataTable对象包含Columns属性和Rows属性分别为DataColumn集合和DataRow集合,它们分别代表结果集的所有列集合与行集合。
l          DataTable 中数据的读取
DataTable中读取数据要用到DataTable的Rows属性,其参数指定一个整数代表将要访问的数据行。
DataRow row=ds.Tables[0].Rows[0];//代表当前行为结果集的第一行
row [0 或者 row [”OrderID” ];//代表要访问当前行的第一列或当前行列名为OrderID的列。使用基于索引的读取数据的方式比使用基于字符串的方式能更快的获取结果。
基于循环的遍历查询结果集的方式如下:
Foreach(DataRow row in ds.Table[0].Rows)
       Foreach(DataColumn col in ds.Table[0].Columns)
              Consol.WriteLine(row[col]);
3. 校验DataTable 中的数据
数据库中提供各种约束以确保数据的有效性,当数据库的查询结果存储到脱机对象DataSet中,对DataSet中的数据进行了增、删、改操作后由SqlDataAdapter提交到数据库,为确保处理后的数据对数据库有效,DataTable需要提供与数据库类似的数据有效性约束机制来保证DataSet中的数据脱机处理后同样遵循数据库有有效性约束。
l          DataColumn 属性
*          ReadOnly
*          AllowDBNull
*          MaxLength
*          Unique( 唯一性)
l          DataTable 类的Constraints 集合
*          UniqueConstraint
       将DataColumn的Unique属性设置为True,也是定义该列在DataTable中的唯一性约束;显示定义唯一性约束是将新创建的UniqueConstraint对象添加到Constraints集合中。
*          PrimaryKey 属性
DataTable类通过PrimaryKey属性定义该表的主键,PrimaryKey属性包含DataColumn对象数组。
*          ForeignKeyConstraint
通常可以通过在DataSet内的两DataTable对象之间建立DataRealation可以隐式的创建外键约束
l          代码中创建DataTable 对象
*          创建DataTable 对象
DataTable dt=new DataTable(“TableName”) ;//创建DataTable对象并同时命名
*          向DataSet 的Tables 集合中添加DataTable
DataTable dt=ds.Tables.Add(“Orders”);//新建DataTable并添加到DataSet中
DataTableMapping dtm = new DataTableMapping();
dtm = da.TableMappings.Add("", "Orders");// 第一个参数为空,第二个参数与定义时一致
DataColumnMapping[]columnMaps;
columnMaps = new DataColumnMapping[]
            {
                new DataColumnMapping("OrderID"," 订单号"),
                            …...
                     }
dtm.ColumnMappings.AddRange(columnMaps);
DataColum col=dt.columns.add(“ 订单号”,typeof(int))
//DataTable中添加列,列名称与columnMaps中定义一致
……//设置col的属性
da.Fill(dt);
DataTable的DataSet属性确定该DataTable是否属于某个DataSet,如果该DataTable是属于某个DataSet的Tables集合,则返回该DataSet,否则返回Null。一个DataTablek至多只能存在于一个DataSet中,如果想将一个DataTable添加到多个DataSet中,必须使用Copy或Clone方法。
*          提取架构信息
默认情况下,DataAdapter类的Fill方法返回的DataSet和DataTable不包含架构信息,如果DataTable中不包含某列,DataAdapter会自动添加这些列到DataTable中。DataAdapter类可以通过MissingSchemaAction属性或FillSchema方法来返回带有架构信息的结果集。由于返回带有架构信息的结果集会带来很大的系统消耗,一般情况可以用代码提供DataTable和DataSet的架构,而避免使用上述两种方式。
l          设置DataTable 约束
*          设置主键 PrimaryKey 属性
DtataTable主键PrimaryKey属性为一个DataColumn对象的数组。
DataTable tbl =ds.Tables.add(“Customers”);
tbl.Columns.Add(“OrderID”,typeof(int));
tbl.Columns.Add(“ProductID”,typeof(int));
tbl.PrimaryKey=new DataColumn[]{
                            tbl.Columns[“OrderID”],
                            tbl.Columns[“ProductID”]};
*          添加其它约束
DataTable类的Constraints集合有一个重载的Add方法,可用于添加新的主键值、唯一键和外键约束。
显式创建唯一性和外键约束的方法如下
DataTable.Constraints.Add(New UniqueConstraint(…));
DataTable.Constraints.Add(New ForeignKeyConstraint(…));
隐式创建主键和唯一性约束代码如下:
DataTable.Constraints.Add(“PK_OrderID”,Orders.Columns[“OrderID”],true);
DataTable.Constraints.Add(“UK_CustomerID”,Orders.Columns[“CustomerID”],false);
//第一个参数代表所建约束的名称,第二个参数是对应添加约束的列,第三个参数true代表主键约束、false代表唯一性约束。
隐式创建外键约束
DataTable.Constraints.Add(“FK_CustomerID”,tblCustomers.Columns[“CustomerID”]
,tblOrders.Columns[“CustomerID”]);
//第一个参数代表约束名称,第二个参数代表父表的DataColumn,第三个数组代表子表中的DataColunm。
l          处理自动增量列
如果数据库中使用自动增量,Ado.Net的自动增量特性有助于在将这些新行提交到数据库之前,使挂起插入一致。
DataColumn col=tbl.Columns.Add(“OrderID”,typeof(int));
col.AutoIncrement=true;
col.AutoIncrementSeed=-1;
col.AutoIncrementStep=-1;
Ado.Net只是根据DataTable中的数据来生成新的自动增量值,它并不代表数据库中要生成的下一自动增量值。因此相对于数据库中的新行,DataTable中的自动增量值只是一个占位符,不能直接提交给数据库。
l          DataTable中添加基于表达式的列
数据库会避免存储能够从数据库中的已有数据中推导出的数据,SQL语言中支持查询结果中包含经过计算的列。
Select UnitPrice ,Quantity, UnitPrice*Quantity as ItemTotal from [Order Details]
以上查询语句的查询结果存储到DataTable后,如果UnitPrice或Quantity有更改,则DataTable中ItemTotal的值不会改变。
Ado.Net支持创建基于表达式的DataColumn对象,可以不在查询中包含计算后的表达式,而是将一个DataColumn的Expression属性设置为一个表达式,这样表达式的值就会随计算项的值变化而变化。
DataTable tbl=ds.Tables.Add(“Orders”);
tbl.Columns.Add(“Quantity”,typeof(int));
tbl.Columns.Add(“UnitPrice”,typeof(Decimal));
tbl.Columns.Add(“ItemTotal”,typeof(Decimal),”Quantity*UnitPrice”);
4. 修改DataTable 中的数据
l          添加新的DataRow
*          DataRowCollection 类的Add 方法
DataTable类的NewRow方法返回新的DataRow对象,设置Item属性填充各列,然后调用DataRowCollection的Add方法将新行添加到DataTable中。
DataTable tbl=new DataTable(“Customers”);
tbl.Columns.Add(“CustomerID”,typeof(string));
tbl.Columns.Add(“CompanyName”,typeof(string));
DataRow row=tbl.NewRow();
row[“CustomerID”]=”NewCo”;
row[“CompanyName”]=”New Customer”
tbl.Rows.Add(row);
DataRowCollection的重载Add方法
tbl.Rows.Add(“NewCo”,”New Customer”);//参数对应DataTable各列的值
以上两种Add方法添加新行的RowState为Added。
*          DataTable 类的LoadDataRow 方法
tbl.LoadDataRow(New Object(){“NewCo”,”New Customer”},False);
第一个参数为DataRow各列值清单,第二个参数为False时将会设置DataRow的RowState为Added;如果为True则DataRow的RowState为Unchanged。
l          修改现有行
*          利用DataRow 的Item 属性
修改DataRow对象时,先利用Rows集合的Find方法找到要修改的行,然后利用其Item属性重新设置各列的值即可。
DataRow row =tbl.Rows.Find(“NewCo”);
If(row==null)
// 未找到相关行
Else
       row[“CompanyName”]=”New Value”
End if
*          使用DataRow 类的BeginEdit 方法和EndEdit 方法
调用BeginEdit和EndEdit方法可以缓冲对数据行的修改,调用EndEdit方法保存对行的更改,如果确定有用保存更改,可以调用CancelEdit来撤销更改,该行将返回到BeginEdit时的状态。
DataRow row =tbl.Rows.Find(“NewCo”);
If(row==null)
// 未找到相关行
Else{
       row.BeginEdit();
       row[“CompanyName”]=”New Value”
   row.EndEdit();
End if
*          使用DataRow 的ItemArray 属性
使用ItemArray属性可以获取修改整个DataRow对象中的数据,每个Item对应DataRow中的一列,可以完成一次更新一行中的多个列值。
DataRow row =tbl.Rows.Find(“NewCo”);
row.ItemArray=new object[]{null,”New Value”};//null代表对应的列不用更改
*          处理DataRow 中的Null
DataRow类的IsNull方法可以查看某一列是否为Null;IsNull方法接受一个列名称或该列索引的整数或一个DataColumn对象为参数
如果某列的值要设置为Null值,应该使用DBNull类的Value属性。
row[“CompanyName”]=DBNull.Value;
l          删除DataRow
*          Delete 方法
删除数据行只用调用DataRow的Delete方法即可,但此方法并没有将数据行从DataTable中删除,而是由Ado.Net将该行标记为挂起删除,以便利用DataAdapter类将挂起删除提交给数据库。如果从DataTable中完全删除该行,那么在提交DataSet的挂起更改时,将不会从数据库中删除相应的行。
*          移除DataRow
DataRowCollection类的Remove或RemoveAt方法实现从DataTable中完全移除一个数据行,而不是将数据行标记为挂起更改
DataRow row =tbl.Rows.Find(“NewCo”);
tbl.Rows.Remove(row);
//or
tbl.Rows.RemoveAt(tbl.Rows.IndexOf(row));
另外,DataSet和DataTable类各具有一个Clear方法,可以清除其全部数据对象,但保留内部结构。
l          DataRow 的RowState 属性
DataSet可以进行数据缓存更改,在向数据库提交这些更改前,缓存更改不会影响到数据库的数据。数据库的更改包括插入、更新、删除,DataRow的RowState属性将记录DataSet的数据更改信息。RowState属性值为DataRowState枚举中的值,列表如下:
常数
说明
Unchanged
2
该行未包含任何更改
Detached
1
该行不是DataTabler 成员
Added
4
该行已经被添加到DataTable,但还不存在于数据库中
Modified
16
该行包含挂起更改
Deleted
8
该行包含挂起删除
SqlDataAdapter类在成功提交存储在DataSet中的挂起更改后,调用DataRow的AcceptChanges方法,清除存储在DataRow中的挂起更改。
DataRow类的RejectChanges方法,用来撤销存储在DataRow中的更改。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值