1. 程式人生 > >DataTable常用操作方法及技巧使用

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();
        }

出處:以上是我平時收集整理,部分來自網上,部分自己編寫,出處已無處可尋,望部分作者諒解。