DataTable常用操作方法及技巧使用
阿新 • • 發佈:2019-01-02
//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(); }
出處:以上是我平時收集整理,部分來自網上,部分自己編寫,出處已無處可尋,望部分作者諒解。