zoukankan      html  css  js  c++  java
  • C#中DataTable排序、检索、合并等操作实例

     

    转载引用至:http://www.jb51.net/article/49222.htm
     
     

    一、排序
    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" });
     

    C#中DataTable删除行的方法,分享给大家供大家参考之用。具体实现方法如下:

    自己的删除例子(drTemp是表,gvSummary是dev 的gridview。单击右键点击grid删除):

    1、dtTemp.Rows.RemoveAt(gvSummary.FocusedRowHandle);

    2、dtTemp.Rows[gvSummary.FocusedRowHandle].Delete();  dtTemp.AcceptChanges();

    在C#中,如果要删除DataTable中的某一行,大致有以下几种办法:

    1.如果只是想删除datatable中的一行,可以用DataRow的delete,但是必须要删除后让DataTable知道,所以就要用到.AcceptChanges()方法,原因是这种删除只是标识性删除,就像我们通常在数据库中用到的IsDelete字段。

    Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除。

    2.彻底删除就要用到datatable的.Rows.Remove(DataRow dr)方法,同理也只是删除一行可以,如果要循环删除请继续往下看。

    3.循环彻底删除就要用.Rows.RemoveAt(int index)方法,所以如果你是foreach的爱好者,在此请你换换口味,还有如果你是for的i++的忠实fans也希望你能换个思维。先看一下上面程序的正向写法(错误的,不可用)

    1
    2
    3
    4
    5
    for (int i = 0, j = dt.Rows.Count; i < j; i++)
    {
      if (Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID)
     dt.Rows.RemoveAt(i);
    }

    这个的错误在于datatable的RemoveAt()会在删除后更新dataTable的index,所以你要删除的index可能已经不是你的符合Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID的index了,甚者还会抛出异常,说你访问的index不存在。

    还是要慎用datatable.Rows.RemoveAt(i),若要删除多行,可以连续用Delete(),然后采用AccepteChanges()方法确认删除。

    使用select方法:

    先把要删除的记录标记一下,然后select删除行,实例代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int i = 0; i < len; i++)
    {
      if (((CheckBox)Rp.Items[i].FindControl("CB")).Checked)
      {
     dt.Rows[i]["C0"] = 1;//标记要删除的记录
      }
    }
    foreach (DataRow r in dt.Select("c0=1"))
    {
      r.Delete();
    }
    Rp.DataSource = dt;
    Rp.DataBind();

    感兴趣的朋友可以测试运行本文实例以加深理解,希望本文所述对大家C#程序设计的学习有所帮助。

  • 相关阅读:
    use paramiko to connect remote server and execute command
    protect golang source code
    adjust jedi vim to python2 and python3
    install vim plugin local file offline
    add swap file if you only have 1G RAM
    datatables hyperlink in td
    django rest framework custom json format
    【JAVA基础】网络编程
    【JAVA基础】多线程
    【JAVA基础】String类的概述和使用
  • 原文地址:https://www.cnblogs.com/markli/p/4450426.html
Copyright © 2011-2022 走看看