校验DataSet中的数据
数据库提供了很多的机制使数据是有效的。ADO.NET的DataSet提供了许多可在数据库系统中使用的相同的数据效验机制。一般可以将这些效验的机制分成两类:列级别的限制和表级别的效限制。列级别的限制:验证DataColumn的属性
DataColumn对象提供了许多能用来验证数据的属性:
ReadOnly:确保数据是否让用户修改
AllowDBNull:一些数据库的列是否可为Null
MaxLength:最多接受字符串的长度
Unique:是否要求该列是不可重复的
表级别的限制:DataTable类的Constraints集合
ADO.NET对象模型包括两个类,可以用他们在DataTable中定义约束。这两个类是UniqueConstraints和ForeignkeyConstraint,他们都是派生于Constraints类的。DataTable公开一个Constraints属性,使用该属性可以添加、修改或查看DataTable上的约束。
UniqueConstraints
如果将DataColumn的Unique属性设置为True,也就在包含该列的DataTable定义了一个唯一的约束。同时还将UniqueConstraints对象加到DataTable对象的Constraints集合中。设置DataColumn的Unique属性比在DataTable对象的Constraints集合中创建一个新的UniqueConstraint要简单,但是在有些时候会需要显示创建UniqueConstraint,例如在需要确保多列合并之后的值为唯一时。
Primarykey
DataTable类允许通过Primarykey属性为DataTable定义一个主键,Primarykey属性包含的是一个DataColumn对象数组,DataTable使用该数组来构造一个UniqueConstraint,以支持

约束。
ForeignkeyConstraint
外部的约束添加到DataTable中。通常可能不需要显示创建ForeignkeyConstraint。在DataSet内的两个DataTable对象之间创建DataRelation也会创建一个ForeignkeyConstraint。

DataRow.RowState属性
DataSet中的一切都是一种脱机缓存,在DataSet所作的一切修改要是不提交数据库的话,那么用途也不是很大。那么在DataSet中修改是会有记录的,这些记录在DataRow.RowState属性中,DataRow.RowState使用的是一个枚举中的值:
Unchanged  该行未包含任何挂起更新
Detached    该行不是DataTable的一个成员
Added         该行已经被添加到了DataTable中,但是不存在在数据库中
Modified      该行被挂起更改
Deleted       该行为挂起删除
例子:
Unchanged  row = tb1.NewRow;row["lmf"] = "liumingfeng";
Detached   row.Rows.Add(row);
Added      row = tb1.Rows(0);
Modified   row["lmf"] = "hello world";
Deleted    row.Delete();

一般来说,DataRow有两个版本,一个是当前的行内容,一个是原来存储在该行的内容。
可以这样来查看不同的版本的内容:

row["lmf",DataRowVersion.Current];//当前的值
row["lmf",DataRowVersion.Original];//原来的值

创建DataRelation对象
在创建DataRelation时,应该提供一个名称,这样就可以在其集合中查找该对象,并且指定该关系所基于的父列和子列。DataRelation有不同的构造函数来接受单个的DataColumn或者是DataColumn对象数组。最后增加在DataSet中的Relations属性中,Relations属性是DataRelation的集合。
用单个的DataColumn创建DataRelation:

//创建数据库结构
DataSet ds = new DataSet("MyDataSet");
DataTable tb1 = ds.Tables.Add("Customers");
tb1.Columns.Add("CustomerID",typeof(string));
tb1.Columns.Add("CustomerName",typeof(string));

tb1 = ds.Tables.Add("Orders");
tb1.Columns.Add("OrderID",typeof(int));
tb1.Columns.Add("CustomerID",typeof(string));
tb1.Columns.Add("OrderDate",typeof(DateTime));

//添加用单个的DataColumn创建DataRelation
DataRelation rel;
rel = new DataRelation("Customer_Orders",ds.Table["Customers"].Columns["CustomerID"],ds.Table["Orders"].Columns["CustomerID"]);
ds.Relations.Add(rel);

如果希望根据多个字段定义DataRelation,那么就要使用接受DataColumn对象数组的构造函数,代码示例:

//创建数据库结构
DataSet ds = new DataSet("MyDataSet");
DataTable tbCustomer = ds.Tables.Add("Customers");
tbCustomer.Columns.Add("CustomerID",typeof(string));
tbCustomer.Columns.Add("CustomerName",typeof(string));

DataTable tbOrder = ds.Tables.Add("Orders");
tbOrder.Columns.Add("OrderID",typeof(int));
tbOrder.Columns.Add("CustomerID",typeof(string));
tbOrder.Columns.Add("CustomerName",typeof(string));
tbOrder.Columns.Add("OrderDate",typeof(DateTime));

//创建引用DataColumn对象的数组
DataColumn[] CustomerP,OrderC;
CustomerP = new DataColumn[]{tbCustomer.Columns["CustomerID"],tbCustomer.Columns["CustomerName"]};
OrderC = new DataColumn[]{tbOrder.Columns["CustomerID"],tbOrder.Columns["CustomerName"]};

//添加用单个的DataColumn创建DataRelation
DataRelation rel;
rel = new DataRelation("Customer_Orders",CustomerP,OrderC);
ds.Relations.Add(rel);

以上的方法都是:先创建一个DataRelation对象,然后再添加到DataSet中的Relations集合中。这个模式和新建的DataTable、DataColumn对象一样的。
还可以使用语法糖:

ds.Relations.Add("Customer_Orders",ds.Table["Customers"].Columns["CustomerID"],ds.Table["Orders"].Columns["CustomerID"]);

DataRelation对象的用途

DataRelation对象属于DataSet所有,记录着DataTable与DataTable的关系,主要的用途是查找有关联的DataTable中的数据。不过DataRelation不亲自处理这个任务,至少不是直接的处理这个任务。这个功能实际上是通过DataRow对象的GetChildRows、GetParentRow和GetParentRows方法提供的。其实在调用这几个方法时,需要DataRelation对象作为参数传入,在这几个方法的内部会引用DataRelation对象来获取表之间的关系,来查找有关的数据的。

使用GetChildRows方法:

//创建数据库结构
DataSet ds = new DataSet("MyDataSet");
DataTable tb1 = ds.Tables.Add("Customers");
tb1.Columns.Add("CustomerID",typeof(string));
tb1.Columns.Add("CustomerName",typeof(string));

tb1 = ds.Tables.Add("Orders");
tb1.Columns.Add("OrderID",typeof(int));
tb1.Columns.Add("CustomerID",typeof(string));
tb1.Columns.Add("OrderDate",typeof(DateTime));

//添加用单个的DataColumn创建DataRelation
DataRelation rel;
rel = new DataRelation("Customer_Orders",ds.Table["Customers"].Columns["CustomerID"],ds.Table["Orders"].Columns["CustomerID"]);
ds.Relations.Add(rel);

//填充DataSet
string strConn,strSQL;
......
SqlDataAdapter da = new SqlDataAdapter(strSQL,strConn);
da.TableMapping.Add("Table","Customers");
da.TableMapping.Add("Table1","Orders");
da.Fill(ds);

//遍历客户
foreach(DataRow row in ds.Tables["Customers"].Rows)
{
    Console.WriteLine("{0}",row[0]);
    //遍历相关的订单,使用GetChildRows方法
    foreach(DataRow rowOrder in row.GetChildRows(rel))
    {
        Console.WriteLine("{0}--{1}",rowOrder["OrderID"],rowOrder["OrderDate"]);
    }
    Console.WriteLine();
}

调用GetChildRows方法的,可将DataRelation对象作为参数传入,也可以使用DataRelation对象的名称作为参数传入。
使用GetParentRow方法:

//遍历订单
DataRow coustomer;
foreach(DataRow row in ds.Tables["Orders"].Rows)
{
    //定位相关的父行,查找顾客
    coustomer = row.GetParentRow("Customer_Orders");
}

转载于:https://www.cnblogs.com/lmfeng/archive/2012/01/11/2319573.html

ADO.NET的记忆碎片(六)相关推荐

  1. ADO.NET的记忆碎片(二)

    接着ADO.NET的记忆碎片(一)继续 Command类在执行SQL的时候,可能会遇到一次执行多条SQL的情况,就像这样: string strConn ="...";//连接字符 ...

  2. ADO.NET的记忆碎片(七)

    使用DataTable类的搜索和筛选功能 DataTable类公开了两个方法:Find和Select Find方法:可以根据主键来查找数据行.Select方法:更类似于筛选器,根据更灵活的搜索条件返回 ...

  3. 14期《掬水月在手,弄花香满衣》1月刊

    1.[sql server 数据库]彻底区分char. nchar. varchar. nvarchar它们之间的关系以及什么时候该用-李光 自荐理由:对于数据库中char. nchar. varch ...

  4. ADO学习(六)服务器和客户端游标

    ADO连接数据库的操作中遇到CursorLocation的adUseClient和adUseServer这两个属性值,收集了些资料,帮助理解. 服务器端游标将结果集放在服务器的缓冲区内,客户端游标将结 ...

  5. oracle ado6,c# ado 连接数据库 六步曲

    建立连接分为六步: 1.定义连接字符串,oracle 的连接字符串为: private static string connString = "Data Source=192.168.1.1 ...

  6. 第六章 使用ADO.NET查询和操作数据

    1.StringBuilder类--定义可变字符串 做到既重复修改,又不创建新的对象(与String类的区别) 常用方法: 1) Append()在结尾追加 2) Insert()在指定位置插入指定字 ...

  7. ADO.NET—数据提供程序(连接类)

    .NET Framework 数据提供程序是专门为数据处理以及快速地只进.只读访问数据而设计的组件. 一.Connection 1.介绍 开启程序和数据库之间的连结 ADO.NET底层 可自己产生对象 ...

  8. ADO.NET Data Services Framework 基础概述

    随着.NET Framework 4.0 及 Visual Studio 2010 的发布, ADO.NET Data Services Framework 2.0 的版本也将同时发布,新的.Net ...

  9. Delphi 原生ADO(二)

    我发现很多朋友在开发数据库时都使用 Delphi 自带的 ADO 组 件 或 Diamond ADO,其实在 Delphi 中使用原生 ADO 接口也是十分方便和有效的.我使用原生 ADO 开发项目已 ...

最新文章

  1. Distilling the Knowledge in a Neural Network 论文笔记蒸馏
  2. Mongodb异常关闭重启失败解决
  3. python中if错误-python中的异常处理
  4. 引导程序为什么要org 07c00h
  5. jsp图片上传(commons-fileupload组件)
  6. 请求地址出现不明的字符%E2%80%8E(Zero-Width Space)
  7. NES模拟器开发-PPU笔记
  8. 浅谈Log4net在项目中如何记录日志
  9. 1910101811-2
  10. MooTools官方插件 - Chain.Wait
  11. 面向对象的关键技术(多态、接口、抽象)
  12. 国家java认证考试报名入口,值得一读!
  13. PyQt5|PySide2 UI界面内嵌web浏览器的方法
  14. python rect用法,功能
  15. 2022年6月青少年软件编程(图形化) 等级考试试卷(一级)
  16. 安卓ps2模拟器_RetroArch 1.9.0 for windows/mac/ios/Android【全平台主机游戏模拟器】
  17. 马云开酒吧了,酒吧叫“平头哥”,真猛~
  18. 趣味三大彩蛋命令安装shell脚本
  19. WPViewPDF Delphi 和 .NET 的 PDF 查看组件
  20. 微信小程序:扫描身份证读取身份信息

热门文章

  1. 关于如何使用反编译器,获取源码清单
  2. android 通过广播唤醒被杀死的app
  3. 【Android.mk】android编译系统makefile文件Android.mk的写法
  4. iphone 系统文件夹
  5. 性能瓶颈分析整体思路
  6. MySQL 用户创建及设置
  7. 【python】闭包
  8. eclipse的下载JDK的安装与配置
  9. SpringMVC Controller的返回类型
  10. C# 对象名无效 问题