ADO.NET的记忆碎片(六)

校验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://www.mzph.cn/news/302973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想不到吧?数学还有如此妙用!

随着科技的快速发展,人工智能的重要性日渐显现。对于大多数新手来说,弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等,都至关重要。机器学习是一个异常丰富的研究领域,有大量未解决的问题:公正、可解释性、易…

python函数列表永久修改_python 禁止函数修改列表的实现方法

有时候,需要禁止函数修改列表。例如要对裂变进行修改操作,也要保留原来的未打印的设计列表,以供备案。为解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响…

ASP.NET Core 开源项目 nopCommerce,一款沉淀13年的电商开源佳作!

技术在不断更新迭代,.NET 6 的正式版也即将正式发布,在.NET Core 开源项目方面,CMS的代表作是SiteServer,商城的开源系统有没有什么代表作?肯定是有的,强烈推荐这套开源免费的商城系统:nopComme…

Base PyQt4, Simple Web APP Framwork

长时间以来,一直针对Linux 服务器开发后台程序,每天面对的是黑框框,输出只有日志文件。偶尔需要模拟客户端测试,要么是写几行php代码,在浏览器上点一点,要么是写个小Python脚本在shell中执行一下。写了一些…

机器学习核心算法之——贝叶斯方法

1.贝叶斯公式贝叶斯公式已经成为机器学习的核心算法之一,诸如拼写检查、语言翻译、海难搜救、生物医药、疾病诊断、邮件过滤、文本分类、侦破案件、工业生产等诸多方面都有很广泛的应用,它也是很多机器学习算法的基础。在这里,有必要了解一下…

python的文件操作os_python文件、文件夹操作OS模块

一、python中对文件、文件夹操作时经常用到的os模块和shutil模块常用方法。1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()2.返回指定目录下的所有文件和目录名:os.listdir()3.函数用来删除一个文件:os.remove()4.删除多个目录:os.rem…

B 站面试官:“啥是重定向?”

三分钟,带你学习和实践域名重定向大家好,我是鱼皮,今天分享 重定向 小知识,以及我在腾讯云云开发中实现域名重定向的实践。孽起之前,我开发了一个编程导航网站,将网站放到了腾讯云云开发上,用云…

java多线程 sleep()和wait()的区别

接触了一些多线程的东西,还是从java入手吧。 相信看这篇文章的朋友都已经知道进程和线程的区别,也都知道了为什么要使用多线程了。 这两个方法主要来源是,sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还…

比起掉头发,我更怕掉队

程序员是最需要持续学习的职业可能在大家眼中,程序员是一群木讷、思维方式单一的物种,但其实,他们才是思维活跃,时刻保持学习力,不甘落后的一群人。计算机行业每天都会有新的东西出现,程序员们需要关注最新…

刷新mac地址命令_配置好Cisco交换机需要熟悉IOS命令及相关的知识

一、几种配置命令模式switch> 这种提示符表示是在用户命令模式,只能使用一些查看命令。switch# 这种提示符表示是在特权命令模式。switch(config)# 这种提示符表示是全局配置模式switch(config-if)# 端口配置命令模式二、检查、查看命令这些命令是查看当前配置…

WPF 使用FontAwesome字体图标

要搞点小软件,又不想使用图标和图标类库,突然想起FontAwesome,试了一下,还挺方便的,先弄了几个最常用的图标试一下,弄了几个按钮的样式,看一下效果:看一下fontAwesome使用方法:首先从…

从Google Maglev说起,如何造一个牛逼的负载均衡?

Maglev是谷歌为自己的数据中心研发的解决方案,并于2008开始用于生产环境。在第十三届网络系统设计与实现USENIX研讨会(NSDI ‘16)上, 来自谷歌、加州大学洛杉矶分校、SpaceX公司的工程师们分享了这一商用服务器负载均衡器Maglev的…

怎么打包图片_超简单的免费批量图片压缩技巧,只需3步

我们在上传图片的时候,经常会遇到一个问题,那就是图片文件太大,无法上传。那这个时候我们该怎么办呢?我们一般都会想到把图片进行压缩之后,重新上传。那么我们要怎么压缩图片呢?如果图片数量很多&#xff0…

Calendar类

接触java不久,感觉java真的挺好玩的。 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法…

Monitor 监测CPU与内存

WPF开发者QQ群: 340500857 开发者:幸运文字-徐守来接着上一篇 优化后效果如下:强烈建议 Win10 使用。增加如下一、解决退出时闪屏和闪烁问题代码如下:private void ExitMonitor(object sender, RoutedEventArgs e){this.OnClose()…

机器学习与气象数据_气象大数据与机器学习联合实验室 大数据和气象的“联姻”...

气象大数据与机器学习联合实验室 大数据和气象的“联姻”来源:《中国科学报》时间:2017-02-13 13:36:28作者:沈春蕾我们每天都在看天气预报,大家会发现天气预报基本准确,但也有那么几天不靠谱。近年来,随着…

史上最牛的5次黑客攻击!比电影还刺激!

好莱坞认为,黑客就像是使用计算机的黑魔导士。在电影中,计算机可以炸毁房屋,关闭公路,释放瘟疫还有引发女权运动。也许有人认为,好莱坞的想象力很丰满,但现实是骨感的。他们错了,因为在现实中&a…

优化 .NET Core logging 中的泛型 logger

优化 .NET Core logging 中的泛型 loggerIntro在微软的 logging 组件中&#xff0c;我们可以比较方便的使用泛型 Logger&#xff0c;如&#xff1a;ILogger<Generic> 这样的&#xff0c;但是如果泛型 Logger 的类型是一个泛型类型就会有些问题&#xff0c;具体的泛型参数…

charts漏斗图表_ECharts漏斗图属性与实例介绍

ECharts漏斗图在 ECharts 系列中&#xff0c;漏斗图使用 series[i]-funnel 表示。漏斗图适用于业务流程比较规范、周期长、环节多的流程分析&#xff0c;通过漏斗各环节业务数据的比较&#xff0c;能够直观地发现和说明问题所在。示例&#xff1a;ECharts漏斗图属性type在漏斗图…

原来R语言还有这些不为人知的用处!

开学钜惠已经进行了好些天啦&#xff0c;前两天小天介绍了关于python课程的开学季限时优惠&#xff08;传送门&#xff09;&#xff0c;你以为这样就结束了吗&#xff1f;不不不&#xff0c;还有R语言系列的优惠没讲过呢。接下来&#xff0c;小天来详细说明一下&#xff01;19月…