1、这篇文章主要介绍了 C#中 DataTable 排序、检索、合并等操作实例,其中详细介绍了 DataTable.Select 的一些注意问题和使用技巧等,需要的朋友可以参考下一、排序1.获取 DataTable 的默认视图2.对视图设置排序表达式3.用排序后的视图导出的新 DataTable 替换就 DataTable(Asc 升序可省略,多列排序用“,“隔开)1)、重生法复制代码 代码如下:dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = “id desc“2)、直接法复制代码 代码如下:dv = New DataView(
2、dt)dv.Sort = “id desc“dt = dv.ToTable();3)、间接法复制代码 代码如下:dv = New DataView(ds.Tables0)dv.Sort = “id desc“dt = dv.ToTable();二、检索设置查询字符串使用 Select 方法获取到所有满足条件的数据行对象数组 (多项查询条件间,用 and 隔开)复制代码 代码如下:DataRow matches = dt.Select(“id003 and name=名字 11“);string strName = matches0“name“.ToString();三、合并假定有 2 个 Da
3、taTable:Dt1 , Dt2。表结构一样将 Dt2 接在 Dt1 后可采用此方法复制代码 代码如下:dt1.Merge(dt2);四、在 DataTable 中查询应该注意的问题完成一个查询,返回一个 DataTable 后,很多时候都想在查询结果中继续搜索。这时可以使用 DataTable.Select 方法对结果进行再查询Select 方法有 4 个重载,我们经常用到的就是 DataTable.Select(String)这个 String 的参数是查询的限定式。相当于 SQL 查询语言中的 WHERE 语句(不含 WHERE),其语法符合 SQL 语言语法。Select 方法的返回
4、的是包含查询到的数据的 DataRow,但是这个 DataRow 只是被查询的 DataTable 的一个映射,所以 DataRow 是随着 DataTable 的行变化而变化的。例如,DataTable 的行都被删除了,那么 DataRow 中的数据同样被删除了(即便是先 Select,再删除的)所以,要想把返回的 DataRow 放进数据显示控件中,需要将其放入另一个 DataTable 中,如果直接放入原 DataTable 或将原 DataTable 的行全部清除再放入查询所得的数据都是不行的,程序会显示错误,错误提示是“表中已有此行”。另外,在一个新表中插入行,不能直接用 DataT
5、able.Rows.Add(DataRow)的方式,因为这样是插入一个新表,也就是 DataRow 是空的。要用导入行的方式,DataTable.ImportRow(DataRow)。当然,前提是这个新表要有与原数据表一样的结构。复制代码 代码如下:Public Function SDEResearch(ByVal InputDT As DataTable, ByVal SearchStr As String) As DataTable用来存储再查询后的数据表 Dim ReSearchDT As DataTable = InputDT.Clone() 保证有与源数据表相同的表结构 用来存储查询
6、后返回的 datarow 数组 Dim ReSearchDR() As DataRow = Nothing Try ReSearchDR = InputDT.Select(“NAME LIKE %“ + SearchStr + “%“) 只是从数据表中映射出来 datarow(),所以不能删除原表中的行 Catch ex As Exception Return Nothing End Try For i As Int16 = 0 To ReSearchDR.Length - 1 ReSearchDT.ImportRow(ReSearchDR(i) Next Return ReSearchDT
7、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.Rowsi“C1“.ToString() = “abc“)/查询条件 /进行操作 但这种做法用一两次还好说,用多了就累了。那有没有更好的
8、方法呢?记得 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
9、 = dt.Select(“C1=abc“, “C2 DESC“);/排序问题又来了,如果要把 DataRow 赋值给新的 DataTable,怎么赋值呢?你可能会想到:复制代码 代码如下:DataTable dtNew = dt.Clone(); for (int i = 0; i drArr.Length; i+) dtNew.Rows.Add(drArri); 但这样程序就会出错,说该 DataRow 是属于其他 DataTable 的,那要怎么做呢?很简单,这样就可以解决了:复制代码 代码如下:DataTable dtNew = dt.Clone(); for (int i = 0;
10、i drArr.Length; i+) dtNew.ImportRow(drArri); 这样就完成了。3.5 里的 DataRow有个扩展方法 CopyToDataTable()复制代码 代码如下:/* * 补充一下,还可以利用 DataView 来达到检索的目的。 */ DataTable dataSource = new DataTable(); DataView dv = dataSource.DefaultView; dv.RowFilter = “columnA = abc“; /1.过滤后直接获取 DataTable DataTable newTable1 = dv.ToTabl
11、e(); /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“ );