C# DataTable使用方法详解

太久没写C#,这段时间项目没那么忙了,利用这段时间温故知新下吧,总结下datatable的使用方法,我主要参考的文章有:

https://blog.csdn.net/qq_36059321/article/details/89947542

            //创建表
            //创建一个没有表名的表
            DataTable dt = new DataTable();
            //创建一个有表名的表
            DataTable table = new DataTable("NewTable");

            //创建列(下面2种都行)
            //创建空列,没有指定列名(默认就是column1)和列的类型(默认就是string)
            table.Columns.Add(new DataColumn());
            table.Columns.Add();
            //创建带列名和类型名的列
            table.Columns.Add("列1",typeof(int));

            //新增空行
            table.Rows.Add();
            //新增有值的行
            table.Rows.Add("列1", "列2", 2);//Add里面参数的数据顺序要和dt中的列的顺序对应 
            //通过复制dt2表的某一行来创建
            //dt.Rows.Add(table.Rows[i].ItemArray);

            //赋值和取值
            //新建行的赋值,这里只是给行赋值了,该行并没有添加到: table
            DataRow dr = table.NewRow();
            dr[0] = "张三";// 通过索引赋值
            dr["column2"] = "李四";//通过字段名赋值

            //将某行加入到表
            table.Rows.Add(dr.ItemArray);

            //对datatable进行赋值(修改)
            table.Rows[1][0] = "第二行第一列";//通过索引赋值
            table.Rows[1]["column2"] = "第二行第二列";//通过字段名称赋值

            //对datatable进行取值
            //string name = dt.Rows[1][0].ToString();
            //string time = dt.Rows[1]["column2"].ToString();

            //筛选数据
            //选择column1列值为空的行的集合
            DataRow[] drs = table.Select("column1 is not null");
            //将DataRow转成datatable
            table = drs.CopyToDataTable();
            //选择column0列值为"李四"的行的集合
            DataRow[] drs1 = dt.Select("column0 = '李四'");
            //筛选column0列值中有"张"的行的集合(模糊查询)
            DataRow[] drs2 = dt.Select("column0 like '张%'");//如果的多条件筛选,可以加 and 或 or
           //筛选column0列值中有"张"的行的集合并按column1降序排序
            DataRow[] drs3 = dt.Select("column0 like '张%'", "column1 DESC");

            //行的删除
            //使用DataTable.Rows.Remove(DataRow)方法
            dt.Rows.Remove(dt.Rows[0]);
            //使用DataTable.Rows.RemoveAt(index)方法
            dt.Rows.RemoveAt(0);
            //使用DataRow.Delete()方法
            dt.Rows[0].Delete();
            dt.AcceptChanges();
            //-----区别和注意点-----
            //Remove()和RemoveAt()方法是直接删除
            //Delete()方法只是将该行标记为deleted,但是还存在,还可DataTable.RejectChanges()回滚,使该行取消删除。
            //用Rows.Count来获取行数时,还是删除之前的行数,需要使用DataTable.AcceptChanges()方法来提交修改。
            //如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows,而且不能用foreach进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。
            for (int i = dt.Rows.Count - 1; i >= 0; i--)
            {
                dt.Rows.RemoveAt(i);
            }
            table.Clear();  //清除表所有的数据

            //复制表,同时复制了表结构和表中的数据
            DataTable dtNew = new DataTable();
            dtNew = dt.Copy();
            //复制表
            //DataTable dtNew = dt.Copy(); //复制dt表数据结构
            //dtNew.Clear() //清空数据
            //for (int i = 0; i < dt.Rows.Count; i++)
            //{
            //    if (条件语句)
            //    {
            //        dtNew.Rows.Add(dt.Rows[i].ItemArray); //添加数据行
            //    }
            //}
            ////克隆表,只是复制了表结构,不包括数据
            //DataTable dtNew = new DataTable();
            //dtNew = dt.Clone();
            ////如果只需要某个表中的某一行
            //DataTable dtNew = new DataTable();
            //dtNew = dt.Copy();
            //dtNew.Rows.Clear();//清空表数据
            //dtNew.ImportRow(dt.Rows[0]);//这是加入的是第一行
            //表排序,排序后再转成 datatable
            table.Rows.Add("第二行第一列", "列3", 2);
            table.Rows.Add("第二行第一列", "列4", 2);
            table.Rows.Add("第二行第一列", "列1", 2);
            table.Rows.Add("第 二行第一列", "列1", 2);
            table.Rows.Add("第 二行第一列", "列1", 2);
            table.DefaultView.Sort = "column1 DESC,column2";
            table = table.DefaultView.ToTable();
            //如上的 ToTable 有2个重载,介绍下
            table = table.DefaultView.ToTable(true, "column1", "column2");  //true是对返回的数据过滤去重,后面所有的参数都是返回字段名,这里是:返回"column1", "column2"字段并且去重
            table = table.DefaultView.ToTable("新表",true, "column1", "column2");//这个是在上面的基础上,对新表取一个名字
            //字段的计算,avg,count,sum,min,max
            table.Compute("avg(字段名)", "字段名>100");
            //合并表
            table.Merge(dt);

            //查询出表的某一列
            var djh1 = table.AsEnumerable().Select(r => r["column1"]).ToList();
            //将查询出来的某一列加载到下拉框里面
            cboFromLine.DataSource = null;
            cboFromLine.DataSource = djh1;

            //datatable的遍历 
            //1、遍历表里面的每一个数据
            for (int i = 0; i < table.Rows.Count; i++)
            {
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    table.Rows[i][j].ToString();
                }
            }
            //2、遍历表里面的每一个数据,使用foreach对每一行处理
            foreach (DataRow dr2 in table.Rows)
            {
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    dr2[j].ToString();
                }
            }

            //对DataTable做LINQ查询
            var results = from myRow in table.AsEnumerable()
                          where myRow.Field<int>("列1") == 1
                          select myRow;
View Code

 

posted @ 2022-04-17 11:19  秋天的林子  阅读(735)  评论(0编辑  收藏  举报