C#中DataTable排序、检索、合并等操作实例
一、排序
1.获取datatable的默认视图
2.对视图设置排序表达式
3.用排序后的视图导出的新datatable替换就datatable(asc升序可省略,多列排序用","隔开)
1)、重生法
dataset.tables(0).defaultview.sort = "id desc"
2)、直接法
dv.sort = "id desc"
dt = dv.totable();
3)、间接法
dv.sort = "id desc"
dt = dv.totable();
二、检索
设置查询字符串
使用select方法获取到所有满足条件的数据行对象数组 (多项查询条件间,用and隔开)
string strname = matches[0]["name"].tostring();
三、合并
假定有2个datatable:dt1 , dt2。表结构一样
将dt2接在dt1后可采用此方法
四、在datatable中查询应该注意的问题
完成一个查询,返回一个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)。当然,前提是这个新表要有与原数据表一样的结构。
'用来存储再查询后的数据表
dim researchdt as datatable = inputdt.clone() '保证有与源数据表相同的表结构
'用来存储查询后返回的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
end function
附:筛选datatable数据的方法
对datatable进行过滤筛选的一些方法select,dataview
当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到:
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("'abc' like c1 + '%'", "c2 desc");//另一种模糊查询的方法
datarow[] drarr = dt.select("c1='abc'", "c2 desc");//排序
问题又来了,如果要把datarow赋值给新的datatable,怎么赋值呢?你可能会想到:
for (int i = 0; i < drarr.length; i++)
{
dtnew.rows.add(drarr[i]);
}
但这样程序就会出错,说该datarow是属于其他datatable的,那要怎么做呢?很简单,这样就可以解决了:
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" });