java datarow_DataSet DataTable DataRow 深入浅出
本篇文章适合有一定的基础的人去查看 ,最好学习过一定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();
}
}
}
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 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 < dt.Columns.Count; 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 < 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()函数进行回滚。
下面来看下增删改的代码
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= 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 voidPrint(DataTable dt)
{foreach (DataRow item indt.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 方法有四个重载,我们只用一个参数的和连个参数的,其中一个参数的是赛选,两个参数的第一个参数为筛选,第二个为排序
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);
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 voidPrintRow(DataRow[] rowArr)
{foreach (DataRow item inrowArr)
{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 voidPrint(DataTable dt)
{foreach (DataRow item indt.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);
}
}
}
}
java datarow_DataSet DataTable DataRow 深入浅出相关推荐
- java datarow_DataTable、DataRow、DataColumn用法
DataSet 表示数据在内存中的缓存. 属性 Tables 获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的 ...
- DataSet DataTable DataRow
DataSet 表示数据在内存中的缓存. 属性 Tables 获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的 ...
- 二、Java内存数据库实践之深入浅出Redis - Redis安装与配置
在开始本篇之前,可先了解上一篇redis的基本知识(一.Java内存数据库实践之深入浅出Redis - Redis介绍) http://josh-persistence.iteye.com/blog/ ...
- java返回datatable_(转)在JAVA实现DataTable对象(三)——DataTable对象实现
1: import java.util.ArrayList; 2: import java.util.List; 3: 6: 7: public final class DataTable { 8: ...
- java 解析 datatabe,在JAVA实现DataTable对象(一)
原文来源:http://www.cnblogs.com/hjzhang/archive/2011/05/21/2052773.html 由于习惯了.net环境下的DataTable对象的方便和强大,遗 ...
- DataTable.DataRow的复制
经常遇到这种错误,"此行已属于另一个表"的错误,导致这个错误的语句如下: dtPriceTable.Rows.InsertAt(aDataRow,i); 或者 dtPriceTab ...
- datatable java排序,Java实现DataTable的过滤,排序,聚合功能
用过C#的知道, 在.net环境下的有个DataTable对象,数据处理非常方便和强大. 可惜Java本身并没有提供这样的类. 在monalisa-db中提供了一个Java版本的DataTable, ...
- 没有体现JAVA接口功能_深入浅出分析Java抽象类和接口【功能,定义,用法,区别】...
本文实例讲述了Java抽象类和接口.分享给大家供大家参考,具体如下: 对于OOP编程来说,抽象是它一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口. 这两者有相似之处也有很 ...
- datatable DataRow
foreach (DataRow dr in dt.Rows) { ss = ss + dr["活动名称"].ToString() + ","; } 转载于:h ...
最新文章
- 这份宝典火了,小哥学后加薪30W+
- 椭圆中心到椭圆切线的距离
- 换工作,让我里外不是人,到底错在哪儿
- RTC领域首个AI算法大赛 AI in RTC 2019 创新挑战赛圆满落幕
- php图片添加代码,php图片添加文字水印实现代码_php技巧
- 我常用的那些 Git 命令
- ArrayList类源码阅读
- 用SVM分类模型处理iris数据集
- DVR NVR CVR有什么区别
- Docker 如何安全地进入到容器内部
- 顶级赛事!2021 CCF大数据与计算智能大赛重磅开赛!
- python七段数码管显示字母代码_python实现七段数码管显示
- Android内嵌H5,安卓手机返回键点击无反应、苹果手机返回键正常情况解决方案
- Matlab小波变换双端行波测距凯伦布尔变换放射状配电网单相故障测距Simulink模型及对应程序
- 在Keras的Embedding层中使用预训练的word2vec词向量
- Respond 的响应式代码阅读
- 网络故障排查常见方法
- 【爱找茬】linux系统和windows系统,你找到了几处不同?
- vue-element-admin(花裤衩)运行err
- C++ 判断是否是格式正确的IP地址
热门文章
- pandas删除dataframe列名称中包含特定字符串的数据列(dropping columns contains specifiec substring in dataframe)
- R语言ggplot2可视化:jupyter中设置全局图像大小、jupyter中自定义单个ggplot2图像结果的大小
- pandas计算滑动窗口中的数值总和实战(Rolling Sum of a Pandas Column):计算单数据列滑动窗口中的数值总和(sum)、计算多数据列滑动窗口中的数值总和(sum)
- R语言grep函数和grepl函数字符匹配实战
- R语言axis函数自定义可视化的坐标轴刻度线(axis ticks)
- 流放之路材质过滤怎么设置_三种不同材质的精密过滤设备特点
- [Google API](5)筛选结果
- 孙立岩 python-basic: 用于学习python基础的课件(161718)
- Real-Time DNA Sequencing from Single Polymerase Molecules
- 单分子测序技术精准解析复杂结构变异