DataTable排序,检索,合并,筛选

摘要:
合并详细信息I排序1以获取DataTable的默认视图2为视图3设置排序表达式,以用排序视图导出的新DataTable替换DataTable(可以省略升序;2)。搜索1以设置查询字符串2。使用Select方法获取满足条件的数据行对象组的数量(在多个查询条件中,Select方法返回包含查询数据的DataRow,然后DataRow中的数据也会被删除(甚至先选择)。

http://apps.hi.baidu.com/share/detail/16252525

DataTable排序,检索,合并,筛选

DataTable排序,检索,合并详解

一、排序
1 获取DataTable的默认视图
2 对视图设置排序表达式
3 用排序后的视图导出的新DataTable替换就DataTable
(Asc升序可省略,多列排序用","隔开)

一、重生法
dstaset.Tables.Add(dt)
dataset.Tables(0).DefaultView.Sort = "id desc"

二、直接法
dv = New DataView(dt)
dv.Sort = "id desc"
dt = dv.ToTable();

三、間接法
dv = New DataView(ds.Tables[0])
dv.Sort = "id desc"

dt = dv.ToTable();

二、检索
1 设置查询字符串
2 使用Select方法获取到所有满足条件的数据行对象数组 (多项查询条件间,用and隔开)

DataRow[] matches = dt.Select("id<'003' and name='名字11'");
string strName = matches[0]["name"].ToString();

三、合并
假定有2个DataTable:Dt1 , Dt2。表结构一样
将Dt2接在Dt1后可采用此方法

dt1.Merge(dt2);

在DataTable中查询应该注意的问题
【简 介】
完成一个查询,返回一个DataTable后,很多时候都想在查询结果中继续搜索。这时可以使用DataTable.Select方法对结果进行再查询

完成一个查询,返回一个DataTable后,很多时候都想在查询结果中继续搜索。这时可以使用DataTable.Select方法对结果进行再查询。

Select方法有4个重载,我们经常用到的就是DataTable.Select(String)

这个String的参数是查询的限定式。相当于SQL查询语言中的WHERE语句(不含WHERE),其语法符合SQL语言语法。

Select方法的返回的是包含查询到的数据的DataRow,但是这个DataRow只是被查询的DataTable的一个映射,所以DataRow是随着DataTable的行变化而变化的。例如,DataTable的行都被删除了,那么DataRow中的数据同样被删除了(即便是先Select,再删除的)

所以,要想把返回的DataRow放进数据显示控件中,需要将其放入另一个DataTable中,如果直接放入原DataTable或将原DataTable的行全部清除再放入查询所得的数据都是不行的,程序会显示错误,错误提示是“表中已有此行”。

另外,在一个新表中插入行,不能直接用DataTable.Rows.Add(DataRow)的方式,因为这样是插入一个新表,也就是DataRow是空的。要用导入行的方式,DataTable.ImportRow(DataRow)。当然,前提是这个新表要有与原数据表一样的结构。

1Public Function SDEResearch(ByVal InputDT As DataTable, ByVal SearchStr As String) As DataTable
2
3 '用来存储再查询后的数据表
4 Dim ReSearchDT As DataTable = InputDT.Clone() '保证有与源数据表相同的表结构
5
6 '用来存储查询后返回的datarow数组
7 Dim ReSearchDR() As DataRow = Nothing
8
9 Try
10 ReSearchDR = InputDT.Select("NAME LIKE '%" + SearchStr + "%'") '只是从数据表中映射出来datarow(),所以不能删除原表中的行
11 Catch ex As Exception
12 Return Nothing
13 End Try
14
15 For i As Int16 = 0 To ReSearchDR.Length - 1
16 ReSearchDT.ImportRow(ReSearchDR(i))
17 Next
18
19 Return ReSearchDT
20 End Function


附:筛选DataTable数据的方法
对DataTable进行过滤筛选的一些方法Select,dataview

当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到:

DataTable dt = new DataTable();//假设dt是由"SELECT C1,C2,C3 FROM T1"查询出来的结果
for (int i = 0; i < dt.Rows.Count; i++)
{
    if (dt.Rows[i]["C1"].ToString() == "abc")//查询条件
    {
        //进行操作
    }
}
但这种做法用一两次还好说,用多了就累了。那有没有更好的方法呢?记得LinQ是可以直接对DataTable进行查询操作的,那在.Net Framework 2.0里,有没有类似的方法呢?答案是肯定的,就是dt.Select(),上面的操作可以改成这样:

DataRow[] drArr = dt.Select("C1=’abc’");//查询
还可以这样操作:

DataRow[] drArr = dt.Select("C1 LIKE ’abc%’");//模糊查询
DataRow[] drArr = dt.Select("’abc’ LIKE C1 + ’%’", "C2 DESC");//另一种模糊查询的方法
DataRow[] drArr = dt.Select("C1=’abc’", "C2 DESC");//排序
问题又来了,如果要把DataRow赋值给新的DataTable,怎么赋值呢?你可能会想到:

DataTable dtNew = dt.Clone();
for (int i = 0; i < drArr.Length; i++)
{
    dtNew.Rows.Add(drArr[i]);
}
但这样程序就会出错,说该DataRow是属于其他DataTable的,那要怎么做呢?很简单,这样就可以解决了:

DataTable dtNew = dt.Clone();
for (int i = 0; i < drArr.Length; i++)
{
    dtNew.ImportRow(drArr[i]);
}
这样就完成了。

3.5里的DataRow[]有个扩展方法CopyToDataTable()

/*
* 补充一下,还可以利用DataView来达到检索的目的。
*/
DataTable dataSource = new DataTable();
DataView dv = dataSource.DefaultView;
dv.RowFilter = "columnA = 'abc'";
//1.过滤后直接获取DataTable
DataTable newTable1 = dv.ToTable();
//2.设置新DataTable的TableName
DataTable newTable2 = dv.ToTable("NewTableName");
//3.设置新表是否过滤重复项,拥有的列的列名以及出现的顺序
//即可以设置新表的字段。但是字段名肯定是老表dataSource中拥有的。
DataTable newTable3 =
dv.ToTable(true, new string[] { "columnA,columnF,columnC" });
//4.综合了2.3两点。
DataTable newTable4 =
dv.ToTable("NewTableName", true, new string[] { "columnA,columnF,columnC" });

免责声明:文章转载自《DataTable排序,检索,合并,筛选》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu16.04安装Python3.6 和pipC#取得控制台应用程序的根目录方法 判断文件夹是否存在,不存在就创建下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HTTP详解--请求、响应、缓存

1. HTTP请求格式              做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。HTTP协议传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。每当我们打开一个网页,在上面点...

网络知识收集

最近学习Ravello虚拟化,遇到一些和网络相关的知识,收集后整理如下: L2其实是指七层网络协议中的第二层数据链路层,它的传输是以mac地址为基础L3指网络层:是以ip地址为基础网络层属于OSI中的较高层次了,从它的名字可以看出,它解决的是网络与网络之间,即网际的通信问题,而不是同一网段内部的事。网络层的主要功能即是提供路由,即选择到达目标主机的最佳...

php的CodeIgniter学习笔记(一)

1,URL Rewrite问题。 一开始,我们的URL是像这样: http://127.0.0.1:8099/works/ci/index.php/blog/ 要变成这样 http://127.0.0.1:8099/works/ci/index/blog/ , 只要像官方说的把.htaccess文件加到根目录里,并在.htaccess加入以下规则就好。 R...

网站日志流量分析系统之数据清洗处理(离线分析)

  网站日志流量分析系统之(日志收集)已将数据落地收集并落地至HDFS,根据网站日志流量分析系统中架构图,接下来要做的事情就是做离线分析,编写MR程序或通过手写HQL对HDFS中的数据进行清洗;由于清洗逻辑比较简单,这里我选择用Hive来对HDFS中的数据进行清洗(当然也可以用MR来清洗)。数据清洗处理过程相对较长,所以:Be patient,please...

Spark 数据读取与保存(输入、输出)

4.数据读取与保存   Spark 的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件系统。 文件格式分为:Text 文件、Json 文件、Csv 文件、Sequence 文件以及 Object 文件; 文件系统分为:本地文件系统、HDFS、HBASE 以及数据库。     1)数据读取:textFile(String)  scala>...

【华为云技术分享】基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一

摘要:仓储管理存在四大细分场景:出入库管理、盘点、分拣和货物跟踪。本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践。 仓储是什么?仓储,是物流生命周期很重要的一部分,首先了解什么物流。 物流,顾名思义“物的流通”,指从物品的供应地向接收地流通,是一个根据实际需要,将运输、核算、储存...