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

1.概念

  DataSetADO.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 有两种事列方式,代码如下

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 = ; 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[].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(, "xiaoli", );
dt.PrimaryKey = new DataColumn[] { dt.Columns[] };//给哪一列设置主键
DataTable dtCopy = dt.Copy();//复制表,连数据和表结构一起复制
DataTable dtClone = dt.Clone();//克隆一个表的结构,不包含数据
DataRow dr= dtClone.NewRow();
dr[] = ;
dr[] = "xiaomei";
dr[] = ;
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 = ; 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"] = ;
dr["Name"] = "xiaomeng";
dr["age"] = ;
dt.Rows.Add(dr);
ds.Tables.Add(dt);//把一个表加入到数据集中
for (int i = ; 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[].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 = ; i < ; i++)
{
dr0 = dt.NewRow();
dr0[] = i;
dr0[] = "xiaoming"+i;
dr0[] = +i+new Random().Next(,);
dr0[] = new Random().Next(i, )%==?"男":"女"; 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[];
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[] ;//删除第一条
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 = ; i < ; i++)
{
dr0 = dt.NewRow();
dr0[] = i;
dr0[] = "xiaoming"+i;
dr0[] = +i+new Random().Next(,);
dr0[] = new Random().Next(i, )%==?"男":"女"; 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);
}
}
}
}

DataSet & DataTable &DataRow 深入浅出的更多相关文章

  1. DataSet - DataTable - DataRow 读取 xml 文件 + 搜索

    DataSet ds = XmlHelper.GetDataSetByXml(AppDomain.CurrentDomain.BaseDirectory + "/Config/ConfigN ...

  2. DataTable,DataSet,DataRow与DataView

    DataTable和DataSet可以看做是数据容器,比如你查询数据库后得到一些结果,可以放到这种容器里,那你可能要问:我不用这种容器,自己读到变量或数组里也一样可以存起来啊,为什么用容器?原因是,这 ...

  3. DataSet,DataTable,DataColumn,DataRow的常用操作

    DataSet 这个玩意没什么好讲的,当ado.net查询出有多张表集合的数据返回时,这个时候就会使用到DataSet. DataTable //表之间直接赋值 dt2=dt1; 两者指向同一内存空间 ...

  4. dataset datatable datacolums datarow

    DataSet 表示数据在内存中的缓存. 属性 Tables  获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的 ...

  5. C#使用DataSet Datatable更新数据库的三种实现方法

    本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参 ...

  6. 手写DataSet,DataTable

    一:DataSet DataSet ds = new DataSet();//创建DataSet DataTable dt = new DataTable();//创建一个DataTalbe dt.C ...

  7. DataSet DataTable操作

    DataSet ds = new DataSet();            DataTable dt = new DataTable("OrderList");          ...

  8. 使用DataSet Datatable 更新数据库的三种方式

    1:自动生成命令的条件 CommandBuilder 方法a)动态指定 SelectCommand 属性b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteC ...

  9. DataSet,DataTable排序(转载)

    DataSet,DataTable排序   关于对已经绑定的DataSet的排序的问题: DataSet ds=new DataSet();DataView dv=new DataView();dv. ...

随机推荐

  1. WINDOWS CLUSTER -- 时间不同步导致的群集问题

    故障描述,重启服务器后,发现该重启节点未成功加入到Windows群集中,导致该节点上的Alwayson服务也受影响处于“正在解析”状态,尝试重启cluster服务,发现无效,查看windows日志,发 ...

  2. asp.net web api 跨域问题

    缘起 以前在asp.net mvc时代,很少出现跨域问题 自从使用了asp.net web api + angular (1/2)之后,开始有跨域问题了. 简单普及下跨域: 我的理解是只要是前台页面与 ...

  3. FluentAPI详细用法

    设置主键 modelBuilder.Entity<x>().HasKey(t => t.Name); 设置联合主键 modelBuilder.Entity<x>().Ha ...

  4. 【计算机网络】 网络体系结构分类: 客户机/服务器体系和P2P

    网络体系结构的分类 现代网络应用程序有两种主流的体系结构: 客户机/服务器体系结构和P2P体系结构(peer to peer “对等”)   一 . 客户机/服务器体系结构     客户机/服务器体系 ...

  5. Shell - 简明Shell入门13 - 用户输入(UserInput)

    示例脚本及注释 1 - arguments #!/bin/bash if [ -n "$1" ];then # 验证参数是否传入 echo "The first para ...

  6. iOS开发-实现相机app的方法[转载自官方]

    This brief code example to illustrates how you can capture video and convert the frames you get to U ...

  7. 原生js,jquery ajax请求以及jsonp的调用

    ajax    是用来处理前后端交互的技术,可以改善用户体验,其本质是    XMLHttpRequest,异步访问服务器并发送请求数据,服务器返回响应的数据,以页面无刷新的效果改变页面中的局部内容  ...

  8. 57.storm拓扑结构调整

    几个概念 Topology(拓扑):Spout.Bolt组成的一个完整的流程结构: Stream Grouping:流分组.数据的分发方式: Spout:直译 水龙头,也就是 消息源 的意思: Bol ...

  9. Xamarin Forms MVVM实现效果说明

    实体对象定义Model2  和Model均可 实现响应效果 public class BaseModel : INotifyPropertyChanged { private bool _select ...

  10. SQL SERVICE日志收缩

    ALTER DATABASE 数据库SET RECOVERY SIMPLE WITH NO_WAIT;ALTER DATABASE 数据库SET RECOVERY SIMPLE; --简单模式DBCC ...