zoukankan      html  css  js  c++  java
  • 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" });
  • 相关阅读:
    【SAS NOTE】OUTPUT
    【SAS NOTES】_NULL_
    【SAS NOTE】sas 9.2 安装
    【SAS NOTE】FREQ
    纯数学教程 Page 203 例XLI (1)
    纯数学教程 Page 203 例XLI (3)
    纯数学教程 Page 203 例XLI (2)
    Prove Cauchy's inequality by induction
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
  • 原文地址:https://www.cnblogs.com/cfas/p/3652738.html
Copyright © 2011-2022 走看看