DataSet & DataTable &DataRow …
2018-06-18 04:03:32来源:未知 阅读 ()
本篇文章适合有一定的基础的人去查看 ,最好学习过一定net 编程基础在来查看此文章。
1.概念
DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。我们可以把DataSet当成内存数据库,DataSet里面可以存储多个表(DataTable);我们称DataSet为数据集对象。
2.DataSet 的常见使用
在C# 中 DataSet 存在于 System.Data 命名空间下,类似于java中包的路径。DataSet 有两种事列方式,代码如下
using System; using System.Data; namespace testData { class Program { static void Main(string[] args) { DataSet ds1 = new DataSet();//无构造实例,不指定DataSetName Console.WriteLine(ds1.DataSetName); DataSet ds2 = new DataSet("MySet");//一个构造实例,指定DataSetName Console.WriteLine(ds2.DataSetName); Console.ReadKey(); } } }
DataSet 常用的属性就一个,Tables ,这里就不过多解释了,如下列出DataSet .Tables 如下常用属性:
// ds.Tables.Count;//获取数据集中存在的表的个数
// ds.Tables.Add(new DataTable());//添加一个表(DataTable)到数据集
//DataTable[] array = { new DataTable(), new DataTable(), new DataTable() };
//ds.Tables.AddRange(array);//添加一个表(DataTable)的数组(Array)到数据集
//ds.Tables.Remove();//删除一个表
//ds.Tables.RemoveAt();//按照表的索引从数据集删除一个表
//ds.WriteXml()//将xml 文件写入到DataSet 数据集中
//ds.ReadXml()//将一个xml 文件读取到数据集中
//ds.Tables.CanRemove()//验证是否可以删除一个集合中的对象。
3.DataTable 的常见使用
DataTable 和DataSet 命名空间一样,实例化的方式有三种,但是常用的就两种,第三种指定了表空间;这里不过多解释,现在我们来看下两种常用实例方式;
实例化1 DataTable dt0 = new DataTable();//没有指定表名,默认表名为 NewDataTable
实例化2 DataTable dt1 = new DataTable("User");//指定表名
using System; using System.Data; namespace testData { class Program { static void Main(string[] args) { DataSet ds = new DataSet("Set"); DataTable dt = new DataTable("User"); ds.Tables.Add(dt);//把一个表加入到数据集中 Console.WriteLine(ds.Tables.Count); Console.WriteLine(ds.Tables[0].TableName); Console.Read(); } } }
通过上面的代码,我们可以看出,我们使用DataSet 的Add方法将一个DataTable 加入数据集。
在前文概述中,我们就说了DataTable 是一个数据表,数据表就要有表头,那么如果创建一个表头呢,上代码
DataSet ds = new DataSet("Set"); DataTable dt = new DataTable("User"); dt.Columns.Add(new DataColumn("ID", typeof(int)));//设定表头ID dt.Columns.Add("Name", typeof(string));//设定表头Name dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name for (int i = 0; i < dt.Columns.Count; i++) { Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]); } foreach (var item in dt.Columns) { Console.WriteLine("遍历表头方式2~~~" + item); } ds.Tables.Add(dt);//把一个表加入到数据集中 Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表 "); Console.WriteLine("当前数据集的表名 " + ds.Tables[0].TableName); Console.Read();
这样一张空的表格,我们就有了,下边就是我们如何添加一个数据行了,别急,我们先来看下DataRow的使用。关于创建一个数据行我们会在高级部分分解。
这里简要说明下DataTable 的其他用法
1 DataTable的复制和数组复制是一样的使用,就是完全Copy 一个方法。
2.DataTable 的克隆,克隆指的是克隆表结构,含主键列
3.我们使用Merge 合并连个表
下列出上诉简要代码
static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.AddRange( new DataColumn[] { new DataColumn("ID",typeof(int)), new DataColumn("UserName",typeof(string)), new DataColumn("Age",typeof(int)) } ); dt.Rows.Add(1, "xiaoli", 33); dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };//给哪一列设置主键 DataTable dtCopy = dt.Copy();//复制表,连数据和表结构一起复制 DataTable dtClone = dt.Clone();//克隆一个表的结构,不包含数据 DataRow dr= dtClone.NewRow(); dr[0] = 2; dr[1] = "xiaomei"; dr[2] = 23; dtClone.Rows.Add(dr); dt.Merge(dtClone);//当主键不同的时候,就会出现合并到一起,如果相同以被合并的表为主,表结构不一致也可以合并,这里就不掩饰了 Console.WriteLine(dt.Rows.Count); Console.Read(); ; }
4.DataRow 的常见使用
DataRow 的创建方式,只有一种,因为我们net 中设定了DataRow不允许实例化,只能通过 DataTable.NewRow()来创建,如 DataRow dr = dt.NewRow();这样我们就得到了一个空行对象。
4.1 如何给DataTable 增加行数据呢??看如下代码
using System; using System.Data; namespace testData { class Program { static void Main(string[] args) { DataSet ds = new DataSet("Set"); DataTable dt = new DataTable("User"); dt.Columns.Add(new DataColumn("ID", typeof(int)));//设定表头ID dt.Columns.Add("Name", typeof(string));//设定表头Name dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name for (int i = 0; i < dt.Columns.Count; i++) { Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]); } foreach (var item in dt.Columns) { Console.WriteLine("遍历表头方式2~~~" + item); } DataRow dr = dt.NewRow(); dr["ID"] = 1; dr["Name"] = "xiaomeng"; dr["age"] = 21; dt.Rows.Add(dr); ds.Tables.Add(dt);//把一个表加入到数据集中 for (int i = 0; i < dt.Rows.Count; i++) { DataRow item= dt.Rows[i]; Console.WriteLine(item["name"]+"今年"+item["age"]+"岁了"); } Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表 "); Console.WriteLine("当前数据集的表名 " + ds.Tables[0].TableName); Console.Read(); } } }
我们很多程序员在开发的时候,都会认为这就把一个数据行添加到DataTable 里面了,其实不是这样的?具体看高级部分
5.综合应用之CRUD(增删改查)
5.1新增
我们在DataRow中是有一个属性叫RowState 叫做行状态,行状态主要有如下值:“UnChange”(无变化),“Added”(新增过后的数据),“Modified”(修改之后的数据),“Deleted” 删除中的数据,如下图,下图为上面添加行数据的代码,断点调试。
通过上诉分析,我们会发现,添加的数据,并没有提交到内存上,只是程序临时存储的。那么我们怎么提交呢,看如下代码。
using System; using System.Data; namespace testData { class Program { static void Main(string[] args) { DataSet ds = new DataSet("Set"); DataTable dt = new DataTable("User"); dt.Columns.Add(new DataColumn("ID", typeof(int)));//设定表头ID dt.Columns.Add("Name", typeof(string));//设定表头Name dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name for (int i = 0; i < dt.Columns.Count; i++) { Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]); } foreach (var item in dt.Columns) { Console.WriteLine("遍历表头方式2~~~" + item); } DataRow dr = dt.NewRow(); dr["ID"] = 1; dr["Name"] = "xiaomeng"; dr["age"] = 21; dt.Rows.Add(dr); dt.AcceptChanges();//提交数据 ds.Tables.Add(dt);//把一个表加入到数据集中 for (int i = 0; i < dt.Rows.Count; i++) { DataRow item= dt.Rows[i]; Console.WriteLine(item["name"]+"今年"+item["age"]+"岁了"); } Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表 "); Console.WriteLine("当前数据集的表名 " + ds.Tables[0].TableName); Console.Read(); } } }
提交代码DataTable.AcceptChanges();那么有内存的提交是不是也应当有内存的回滚,这里不过多介绍了,我们来看下
DataTable 新增行数据的时候状态 为 Added ,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。
DataTable 修改行数据的时候状态 为 Modified ,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。
DataTable 删除行数据的时候状态 为 Deleted,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。
下面来看下增删改的代码
using System; using System.Data; namespace testData { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); DataColumn[] arrayColumn = { new DataColumn("id", typeof(int)), new DataColumn("name", typeof(string)), new DataColumn("age", typeof(int)), new DataColumn("sex", typeof(string)) }; dt.Columns.AddRange(arrayColumn); Console.WriteLine("---------------------------新增---------------------------"); DataRow dr0 = null; for (int i = 0; i < 5; i++) { dr0 = dt.NewRow(); dr0[0] = i; dr0[1] = "xiaoming"+i; dr0[2] = 20+i+new Random().Next(1,10); dr0[3] = new Random().Next(i, 200)%3==0?"男":"女"; dt.Rows.Add(dr0); } Console.WriteLine("新增没有提交打印"); Print(dt); Console.WriteLine("状态==================" + dr0.RowState); dt.AcceptChanges();//新增提交 Console.WriteLine("新增提交后打印"); Print(dt); Console.WriteLine("状态==================" + dr0.RowState); Console.WriteLine("---------------------------修改---------------------------"); DataRow dr1 = dt.Rows[0]; dr1["name"] = "wbcsky"; Console.WriteLine("修改没有提交打印"); Print(dt); Console.WriteLine("状态==================" + dr1.RowState); dt.AcceptChanges();//新增提交 Console.WriteLine("修改提交后打印"); Print(dt); Console.WriteLine("状态==================" + dr1.RowState); Console.WriteLine("---------------------------删除---------------------------"); DataRow dr2=dt.Rows[0] ;//删除第一条 dr2.Delete();//这里没有使用dt.rmove 和dt.rmoveat,因为这两个方法直接提交了 Console.WriteLine("删除没有提交打印"); Print(dt); Console.WriteLine("状态==================" + dr2.RowState); dt.AcceptChanges();//新增提交 Console.WriteLine("删除提交后打印"); Print(dt); Console.WriteLine("状态==================" + dr2.RowState); Console.Read(); } private static void Print(DataTable dt) { foreach (DataRow item in dt.Rows) { string msg = ""; try { msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}"; } catch (Exception e) { msg =e.Message; } Console.WriteLine(msg); } } } }
执行结果如下图
6.综合应用之筛选排序
我们如果想给上面的表排序,要怎么排序呢?????,其实排序我们使用DataTable.Select 方法就可以,我们看下怎么使用
我们会看到select 方法有四个重载,我们只用一个参数的和连个参数的,其中一个参数的是赛选,两个参数的第一个参数为筛选,第二个为排序
using System; using System.Data; namespace testData { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); DataColumn[] arrayColumn = { new DataColumn("id", typeof(int)), new DataColumn("name", typeof(string)), new DataColumn("age", typeof(int)), new DataColumn("sex", typeof(string)) }; dt.Columns.AddRange(arrayColumn); DataRow dr0 = null; for (int i = 0; i < 5; i++) { dr0 = dt.NewRow(); dr0[0] = i; dr0[1] = "xiaoming"+i; dr0[2] = 20+i+new Random().Next(1,5); dr0[3] = new Random().Next(i, 200)%3==0?"男":"女"; dt.Rows.Add(dr0); } Console.WriteLine("---------------------------筛选之前---------------------------"); Print(dt); DataRow[] rowArr= dt.Select("age >25", " age desc"); Console.WriteLine("---------------------------筛选之后按年龄排序---------------------------"); PrintRow(rowArr); Console.Read(); } private static void PrintRow(DataRow[] rowArr) { foreach (DataRow item in rowArr) { string msg = ""; try { msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}"; } catch (Exception e) { msg = e.Message; } Console.WriteLine(msg); } } private static void Print(DataTable dt) { foreach (DataRow item in dt.Rows) { string msg = ""; try { msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}"; } catch (Exception e) { msg =e.Message; } Console.WriteLine(msg); } } } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Invalid [xxx] in servlet mapping 、 <url-pattern& 2020-06-07
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为: & 2020-06-06
- Spring boot Sample 003之spring-boot-configuration-proper 2020-06-01
- 前端 技术之 Git&GitHub 2020-05-29
- springboot 启动报错"No bean named 'org. 2020-05-29
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash