欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#中DataTable排序、检索、合并等操作实例

程序员文章站 2023-12-18 21:08:04
一、排序1.获取datatable的默认视图2.对视图设置排序表达式3.用排序后的视图导出的新datatable替换就datatable(asc升序可省略,多列排序用","...

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

复制代码 代码如下:
dstaset.tables.add(dt)
dataset.tables(0).defaultview.sort = "id desc"

2)、直接法
复制代码 代码如下:
dv = new dataview(dt)
dv.sort = "id desc"
dt = dv.totable();

3)、间接法
复制代码 代码如下:
dv = new dataview(ds.tables[0])
dv.sort = "id desc"
dt = dv.totable();


二、检索

设置查询字符串
使用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方法对结果进行再查询
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)。当然,前提是这个新表要有与原数据表一样的结构。

复制代码 代码如下:
public function sderesearch(byval inputdt as datatable, byval searchstr as string) as datatable

'用来存储再查询后的数据表
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
当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到:

复制代码 代码如下:
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" });

上一篇:

下一篇: