博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADO.NET的记忆碎片(六)
阅读量:5949 次
发布时间:2019-06-19

本文共 4973 字,大约阅读时间需要 16 分钟。

校验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");
}

 

 

 

 

 

 

转载地址:http://rdsxx.baihongyu.com/

你可能感兴趣的文章
python3之装饰器修复技术@wraps
查看>>
[考试]20150606
查看>>
Javascript_备忘录5
查看>>
Can’t create handler inside thread that has not called Looper.prepare()
查看>>
敏捷开发方法综述
查看>>
Hadoop数据操作系统YARN全解析
查看>>
Django 运行报错 ImportError: No module named 'PIL'
查看>>
修改数据库的兼容级别
查看>>
Windows下同时安装两个版本Jdk
查看>>
uoj#228. 基础数据结构练习题(线段树)
查看>>
JS键盘事件监听
查看>>
ios开发周期之--(向上,向下,四舍五入)取整
查看>>
加油!
查看>>
拦截导弹问题(动态规划)
查看>>
iOS 单元测试(Unit Test 和 UI Test)
查看>>
[linux小技巧]
查看>>
文件下载_中文乱码:"Content-disposition","attachment; filename=中文名
查看>>
HBase 笔记3
查看>>
2017.11.23 display fun --STM8
查看>>
深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器
查看>>