热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javadatarow_DataSetDataTableDataRow深入浅出

本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据

本篇文章适合有一定的基础的人去查看 ,最好学习过一定net 编程基础在来查看此文章。

1.概念

DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。我们可以把DataSet当成内存数据库,DataSet里面可以存储多个表(DataTable);我们称DataSet为数据集对象。

DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。DataTable是ADO dot net 库中的核心对象。它可以被应用在 VB 和 ASP 上。它无须代码就可以简单的绑定数据库。它具有微软风格的用户界面。

其他使用DataTable的对象包括DataSet和DataView,DataTable中存放的是一行行的数据,这一行行的数据就是DataRow 的数组(Array);我们称DataTable 为数据表对象。

DataRow是DataTable中的数据行,他内部有包含多个数据列,每个列可以存储不同类型的值。

2.DataSet 的常见使用

在C# 中 DataSet 存在于 System.Data 命名空间下,类似于java中包的路径。DataSet 有两种事列方式,代码如下

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{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();

}

}

}

5f48149bd5f14e74b43e012a83bd090c.png

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

{

Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);

}foreach (var item indt.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= newDataTable();

dt.Columns.AddRange(newDataColumn[]

{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 增加行数据呢??看如下代码

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{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

{

Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);

}foreach (var item indt.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

{

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” 删除中的数据,如下图,下图为上面添加行数据的代码,断点调试。

36141bd8f886b0d261eee749dc09d35c.png

通过上诉分析,我们会发现,添加的数据,并没有提交到内存上,只是程序临时存储的。那么我们怎么提交呢,看如下代码。

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

{

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

{

DataRow item= dt.Rows[i];

Console.WriteLine(item["name"]+"今年"+item["age"]+"岁了");

}

Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表 ");

Console.WriteLine("当前数据集的表名 " + ds.Tables[0].TableName);

Console.Read();

}

}

}

3ededdb74295294dee5c34b0747d019c.png

提交代码DataTable.AcceptChanges();那么有内存的提交是不是也应当有内存的回滚,这里不过多介绍了,我们来看下

DataTable 新增行数据的时候状态 为 Added ,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。

DataTable 修改行数据的时候状态 为 Modified ,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。

DataTable 删除行数据的时候状态 为 Deleted,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。

下面来看下增删改的代码

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{static void Main(string[] args)

{

DataTable dt= newDataTable();

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&#61; null;for (int i &#61; 0; i <5; i&#43;&#43;)

{

dr0&#61;dt.NewRow();

dr0[0] &#61;i;

dr0[1] &#61; "xiaoming"&#43;i;

dr0[2] &#61; 20&#43;i&#43;new Random().Next(1,10);

dr0[3] &#61; new Random().Next(i, 200)%3&#61;&#61;0?"男":"女";

dt.Rows.Add(dr0);

}

Console.WriteLine("新增没有提交打印");

Print(dt);

Console.WriteLine("状态&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" &#43;dr0.RowState);

dt.AcceptChanges();//新增提交

Console.WriteLine("新增提交后打印");

Print(dt);

Console.WriteLine("状态&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" &#43;dr0.RowState);

Console.WriteLine("---------------------------修改---------------------------");

DataRow dr1&#61; dt.Rows[0];

dr1["name"] &#61; "wbcsky";

Console.WriteLine("修改没有提交打印");

Print(dt);

Console.WriteLine("状态&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" &#43;dr1.RowState);

dt.AcceptChanges();//新增提交

Console.WriteLine("修改提交后打印");

Print(dt);

Console.WriteLine("状态&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" &#43;dr1.RowState);

Console.WriteLine("---------------------------删除---------------------------");

DataRow dr2&#61;dt.Rows[0] ;//删除第一条

dr2.Delete();//这里没有使用dt.rmove 和dt.rmoveat,因为这两个方法直接提交了

Console.WriteLine("删除没有提交打印");

Print(dt);

Console.WriteLine("状态&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" &#43;dr2.RowState);

dt.AcceptChanges();//新增提交

Console.WriteLine("删除提交后打印");

Print(dt);

Console.WriteLine("状态&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;" &#43;dr2.RowState);

Console.Read();

}private static voidPrint(DataTable dt)

{foreach (DataRow item indt.Rows)

{string msg &#61; "";try{

msg&#61; $"id&#61;{ item[0]},name&#61;{item[1]},age&#61;{item[2]},sex&#61;{item[3]}";

}catch(Exception e)

{

msg&#61;e.Message;

}

Console.WriteLine(msg);

}

}

}

}

执行结果如下图

54aefe4a30ab5257c99a394f20f759f5.png

6.综合应用之筛选排序

我们如果想给上面的表排序&#xff0c;要怎么排序呢&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff0c;其实排序我们使用DataTable.Select 方法就可以&#xff0c;我们看下怎么使用

67efb8505509bbfbff7ad01a69746d84.png

我们会看到select 方法有四个重载&#xff0c;我们只用一个参数的和连个参数的&#xff0c;其中一个参数的是赛选&#xff0c;两个参数的第一个参数为筛选&#xff0c;第二个为排序

usingSystem;usingSystem.Data;namespacetestData

{classProgram

{static void Main(string[] args)

{

DataTable dt&#61; newDataTable();

DataColumn[] arrayColumn&#61;{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&#61; null;for (int i &#61; 0; i <5; i&#43;&#43;)

{

dr0&#61;dt.NewRow();

dr0[0] &#61;i;

dr0[1] &#61; "xiaoming"&#43;i;

dr0[2] &#61; 20&#43;i&#43;new Random().Next(1,5);

dr0[3] &#61; new Random().Next(i, 200)%3&#61;&#61;0?"男":"女";

dt.Rows.Add(dr0);

}

Console.WriteLine("---------------------------筛选之前---------------------------");

Print(dt);

DataRow[] rowArr&#61; dt.Select("age >25", "age desc");

Console.WriteLine("---------------------------筛选之后按年龄排序---------------------------");

PrintRow(rowArr);

Console.Read();

}private static voidPrintRow(DataRow[] rowArr)

{foreach (DataRow item inrowArr)

{string msg &#61; "";try{

msg&#61; $"id&#61;{ item[0]},name&#61;{item[1]},age&#61;{item[2]},sex&#61;{item[3]}";

}catch(Exception e)

{

msg&#61;e.Message;

}

Console.WriteLine(msg);

}

}private static voidPrint(DataTable dt)

{foreach (DataRow item indt.Rows)

{string msg &#61; "";try{

msg&#61; $"id&#61;{ item[0]},name&#61;{item[1]},age&#61;{item[2]},sex&#61;{item[3]}";

}catch(Exception e)

{

msg&#61;e.Message;

}

Console.WriteLine(msg);

}

}

}

}



推荐阅读
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • 本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。 ... [详细]
  • Java中List的forEach方法与字符串拼接的兼容性问题
    本文深入探讨了在Java中使用List的forEach方法时遇到的字符串拼接问题,提供了有效的解决方案及背后的原理分析,旨在帮助开发者更好地理解和解决此类问题。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • 使用Java计算两个日期之间的月份数
    本文详细介绍了利用Java编程语言计算两个指定日期之间月份数的方法。文章通过实例代码讲解了如何使用Joda-Time库来简化日期处理过程,旨在为开发者提供一个高效且易于理解的解决方案。 ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 本文介绍如何通过mysqladmin ext命令监控MySQL数据库的运行状态,包括性能指标的实时查看和分析。 ... [详细]
  • Java中提取字符串的最后一部分
    本文介绍了如何使用Java中的substring()和split()方法来提取字符串的最后一部分,特别是在处理包含特殊字符的路径时的方法与技巧。 ... [详细]
  • Java多线程售票案例分析
    本文通过一个售票系统的实例,深入探讨了Java中的多线程技术及其在资源共享和并发控制中的应用。售票过程涉及查询、收款、找零和出票等多个步骤,其中对总票数的管理尤为关键。 ... [详细]
author-avatar
菲拉慕格_516
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有