DataTable常用操作方法及技巧使用

        
        //testData()方法并无实质作用,只是把事例写在里面而已</span>
        public void testData()
        {
            //创建DataTable
            DataTable dt = new DataTable("Users");

            //新增列
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("name", typeof(string));
            //或者用dt.Columns.Add("column0", System.Type.GetType("System.String"));

            //设置主建
            dt.Columns["id"].Unique = true;
            dt.PrimaryKey = new DataColumn[] { dt.Columns["id"] };

            //添加10行数据
            for (int id = 1; id <= 10; id++)
            {
                dt.Rows.Add(
                    new object[] { id, string.Format("姓名{0}", id) });
            }

            //复制具有表中行结构的新行
            DataRow dr = dt.NewRow();
            dr["id"] = 3;
            dr["name"] = "李某某";
            dt.Rows.Add(dr);

            //提交自上次调用 AcceptChanges 以来对该表进行的所有更改。
            dt.AcceptChanges();

            //按姓名排序查询ID>5的数据行数组
            DataRow[] foundRows = dt.Select("id > 5", "name DESC");

            //查询符合条件的数据行数组
            DataRow[] drs = dt.Select("name is null");
            DataRow[] drss = dt.Select("name = 'kyle'");

            //复制表格与数据
            DataTable dtNew = dt.Copy();

            //只复制表格结构
            DataTable Nulldt = dt.Clone();

            //修改行
            int r = 0;    //行索引,从0开始你懂的
            int c = 0;    //列索引
            DataRow dr = dt.Rows[r];
            dr[c] = 1;
            dr[c+1] = "Yan";
            //或者
            //dt.Rows[0]["name"]="姓名2";

            //转换成字符串
            System.IO.StringWriter sw = new System.IO.StringWriter();
            System.Xml.XmlTextWriter xw = new System.Xml.XmlTextWriter(sw);
            dt.WriteXml(xw);
            string result = sw.ToString();

            //转换成视图再过滤数据
            dt.DefaultView.RowFilter = " name like '%张%' ";    //查询张姓的用户
            //RowFilter注意:针对某个DataView设置了多次RowFilter,那么最后一次的设置将生效, 设置RowFilter后使用foreach处理dataview,其实处理的是数据视图的副本,循环内对DataView的<br>RowFilter再次设置不影响foreach处理的集合副本. 当然也可以使用DataView tDv=new DataView(DataTable);来生成一个新的视图来避免冲突问题--如果使用这种方式那么就上面情况,<br>内存中将有两个dataView(对应一个datatable)如果再使用foreach进行集合便历,那么明显要多出一个dataview内存需求.

            //表格排序
            dt.DefaultView.Sort = "ID ,Name ASC";
            dt = dt.DefaultView.ToTable();

            // 对列name 汇总支持所有sql 聚合函数 如:sum(),count(),avg()...
            dt.Compute("count(name)", "true");

            //转成Linq进行Group By
            if (dt != null && dt.Rows.Count > 0)
            {
                var query = from t in dt.AsEnumerable()
                            group t by new { t1 = t.Field<Int32>("id") } into m
                            select new
                            {
                                id = m.Key.t1
                            };

                DataRow[] arrayDR = null;

                if (query.ToList().Count > 0)
                {
                    query.ToList().ForEach(q =>
                    {
                        arrayDR = dt.Select(" id=" + q.id);    //获取进程行号下的所有数据

                        if (arrayDR.Length > 0)
                        {
                            result += q.id + "(";
                            foreach (DataRow dr2 in arrayDR)    //多行合并成一行
                            {
                                result += dr["name"].ToString() + ",";
                            }
                            result = result.Substring(0, result.Length - 1);    //去除最后面的逗号
                            result += ")";
                        }
                    });
                }
            }

            //是否存在SEX列(是否存在某列)
            bool isExistsColumn = dt.Columns.Contains("SEX");

            //DataTable与XML间的互转
            DataTable dt_AX = new DataTable();
            string xml = ConvertBetweenDataTableAndXML_AX(dt_AX);
            DataTable dt2 = ConvertBetweenDataTableAndXML_AX(xml);

            //使用Newtonsoft.Json将DataTable转换成JSION
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(dt, new Newtonsoft.Json.Converters.IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd" });
            //或者json = Newtonsoft.Json.JsonConvert.SerializeObject(dt);

        }

        //DataTable转XML
        public string ConvertBetweenDataTableAndXML_AX(DataTable dtNeedCoveret)
        {
            System.IO.TextWriter tw = new System.IO.StringWriter();               
            dtNeedCoveret.TableName = dtNeedCoveret.TableName.Length == 0 ? "Table_AX" : dtNeedCoveret.TableName;
            dtNeedCoveret.WriteXml(tw);
            dtNeedCoveret.WriteXmlSchema(tw);
            return tw.ToString();
        }

        //XML转DataTable
        public DataTable ConvertBetweenDataTableAndXML_AX(string xml)
        {
            System.IO.TextReader trDataTable = new System.IO.StringReader(xml.Substring(0, xml.IndexOf("<?xml")));
            System.IO.TextReader trSchema = new System.IO.StringReader(xml.Substring(xml.IndexOf("<?xml")));
            DataTable dtReturn = new DataTable();
            dtReturn.ReadXmlSchema(trSchema);
            dtReturn.ReadXml(trDataTable);
            return dtReturn;
        }

        //DataTable转JSION
        public string DataTableToJson(string jsonName, DataTable dt)
        {
            StringBuilder Json = new StringBuilder();
            Json.Append("{\"" + jsonName + "\":[");
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Json.Append("{");
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":\"" + dt.Rows[i][j].ToString() + "\"");
                        if (j < dt.Columns.Count - 1)
                        {
                            Json.Append(",");
                        }
                    }
                    Json.Append("}");
                    if (i < dt.Rows.Count - 1)
                    {
                        Json.Append(",");
                    }
                }
            }
            Json.Append("]}");
            return Json.ToString();
        }

出处:以上是我平时收集整理,部分来自网上,部分自己编写,出处已无处可寻,望部分作者谅解。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值