一。建立一個記憶體表,下面的代碼會用到它 DataTable auto = new DataTable(); auto.Columns.Add("ID"); auto.Columns.Add("Name"); for(int i=1;i<=10;i++) { auto.Rows.Add(new object[]{i,"baibaoqing"}); } 二。下面介紹DataTable對象經常使用的方法 1. DataTable 的複製和複製 建立DataTable的完全副本(full copu 複製表的結構和資料),通過DataTable的Copy方法實現 DataTable copy_Table=auto.Copy() for(int i=0;i<copy_Table.Rows.Length;i++) { Response.Write("<script>alert("+copy_Table.Rows[i][0]+");</script>"); } 輸出的結果為從0到10 的數字 有時需要複製DataTable 的表模式(表結果)而不複製資料,可以使用DataTable的Clone方法 DataTable clone_Table=auto.Clone(); 在複製了一個DataTable後,可能需要DataTable對象中的某些DataRow對象(行資料)複製到複製的DataTabel 中,可以使用DataTable 的ImPortRow方法 clone_Table.ImportRow(auto.Rows[0]); 2.枚舉DataTable 通過Foreach迴圈遍曆DataTable的行和列 System.Text.StringBuilder buffer=new System.Text.StringBuiler(); foreach(DataColumn dc in auto.Colmns) { buffer.Append(String.Format(“{0,15}”,dc.ColumnName)); } buffer.Append("/r/t"); foreach(DataRow dr in auto.Rows) { foreach(DataColumn dc in auto.Colmns) { buffer.Append(String.Format("{0,15}",dr[dc])); } buffer.Append("/r/t"); } textbox1.Text=buffer.ToString(); 三. 使用DataView 1. Sort排序 DataView view=new DataView(auto); view.Sort="Make ASC,Year DESC"; 不過我很少使用DataView 的排序功能,我的作法是在SQL語句中使用Order by 2. 使用RowFilter 精確尋找 DataView view=new DataView(auto); view.RowFilter="Make like 'AA%' and Year>2001"; 同樣也可以在SQL語句中設定查詢條件,看個人的習慣和實際的需要了。 3 將DataView 匯出到一個新表 DataTable new_Table=view.ToTable("MyTable",true,"id","name"); MyTable 新表的名稱,true 表示顯示不同的值,將相同的行刪除(相當於Sql 的distinct), id 和name 為新表的列ID. 4. 枚舉DataView 和枚舉DataTabe大同小異 System.Text.StringBuilder buffer=new System.Text.StringBuiler(); foreach(DataColumn dc in auto.Colmns) { buffer.Append(String.Format(“{0,15}”,dc.ColumnName)); } buffer.Append("/r/t"); foreach(DataRowView dv in view) { foreach(DataColumn dc in auto.Colmns) { buffer.Append(String.Format("{0,15}",dv[dc])); } buffer.Append("/r/t"); } textbox1.Text=buffer.ToString(); 另外在.net 2.0中DataTable對象可以處理XML檔案,和DataSet一樣,DataTable對象也有ReadXml和WriteXml 的方法,沒有具體用過,有機會使用時再做總結。 ------------------------------------------------------------------------------------------------------------------------------------------ 通過DataTable獲得表的主鍵 很多情形下我們需要知道表的主鍵是什麼。在ADO.Net中提供了DataTable可以映射資料庫的表。於是便可以利用DataTable的屬性PrimaryKey,它是DataColumn[] 類型是一個數組。我們可以使用如下的代碼 DataColumn[] cols; cols = Table.PrimaryKey; //注意不是cols是DataColumn數組,不是DataColumn變數。這樣做主要是為了處理聯合主鍵的問題。 for(int i = 0; i < cols.Length; i++) { MessageBox.Show(cols[i].ColumnName); } 按理這個問題就已經解決了,但是cols.Length卻是0。原來在預設的情況下填充DataTable時並沒有從資料庫中取的主鍵的資訊。如何獲得主鍵呢?經過研究發現在填充Dataset的時候可以使用DataAdapter的MissingSchemaAction屬性協助我們解決這個問題,於是有如下的代碼: //使用DataAdapter填充DataTable dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; dataadapter.Fill(Table); DataColumn[] cols; cols = Table.PrimaryKey; //注意不是cols是DataColumn數組,不是DataColumn變數。這樣做主要是為了處理聯合主鍵的問題。 for(int i = 0; i < cols.Length; i++) { MessageBox.Show(cols[i].ColumnName); } 這樣我們便可以如願以償了。MissingSchemaAction屬性是確定現有Dataset(或DataTable)架構與傳入資料不匹配時需要執行的操作。MissingSchemaAction.AddWithKey是枚舉值,它的作用是添加必需的列和主鍵資訊以完成架構,利用它使用者可以在每個 DataTable上顯式設定主鍵約束。 ------------------------------------------------------------------------------------------------------------------------------------------ DataTable中資料記錄的統計 我們在使用Sql Server這些資料庫時,可以輕鬆的通過Sum、Aver、Count等統計出相關結果,那麼,在已經把資料檢索出來的DataSet(DataTable)中呢?特別是通過Web Service獲得了DataSet,這個時候,可是沒有辦法回頭去修改Select語句來擷取這些統計了。那麼在DataSet/DataTable中是否可以進行統計呢? 在MSDN中,有一篇MS推薦的統計方法,就是逐行對資料進行求和統計,這個方法,其實有等於無(或許這個方法只是針對於DataGrid求取小計用吧),因為這個方法中採用的是DataGrid的ItemDataBind事件來對資料進行累加,同我們手動寫代碼統計沒有什麼區別。 本文介紹一個簡單的方法,不需要逐條記錄進行計算就可以輕鬆的獲得DataTable中的記錄統計結果。這個簡單的方法就是調用功能強大的DataTable的函數Compute。 一、調用說明(僅以C#為例,下同): public object Compute(string strExpression,string strFilter) 參數: strExpression:要計算的運算式字串,基本上類似於Sql Server中的統計運算式 strFilter:統計的過濾字串,只有滿足這個過濾條件的記錄才會被統計 二、調用舉例: 以下樣本,假設一個產品銷售表table,描述某商場中各促銷員銷售的實際記錄,包含欄位為:姓名(Name)、性別(Sex,0為女,1為男)、生日(Birthday)、銷售產品的代碼(ProID)、銷售的數量(Quantity)、銷售價格(Price)。 1。統計所有性別為女的銷售人員的數量: table.Compute("Count(*)","Sex=0"); 2。統計所有銷售人員中年齡大於20歲的 table.Compute("Count(*)","Birthday<'"+today);//today為今天的日期文字 3。統計銷售產品的平均價格 table.Compute("Aver(Price)","true"); 4。統計產品代碼為1的產品銷售數量: table.Compute("Sum(Quantity)","ProID=1"); 5。統計所有產品的銷售總金額: 要統計總銷售金額,由於table中不存在某項產品某個促銷員銷售的金額資料,但我們可以通過Quantity*Price來獲得。比如: table.Compute("Sum(Quantity*Price)","true"); 這裡一個問題是:DataTable的統計功能沒有SqlServer強,這個統計是錯誤的,因為Compute的統計不具備Sum(Quantity*Price)這樣資料的功能。那怎麼辦呢? 對於這樣複雜資料的統計,我們可以在DataTable中建立一個新的欄位來完成,比如Amount,同時設定該欄位的Expression為Quantity*Price,這樣我們就可以使用統計功能了: table.Compute("Sum(Amount)","true"); 以上都是計算每一列的合計,要添加一行求合計可以使用下面的方法: System.Data.DataRow dataRow=dataSet.Tables[0].NewRow() '假設你的DataSet為dataSet,表在索引0位置,同時假設你的所有欄位都是可以求合計的。 轉地址:http://chinesewind.cnblogs.com/archive/2005/11/30/287957.html System.DataRow dataRow = new System.DataRow(); dataRow=DT.NewRow(); 然後就是統計了: int i ; int fldCnt ; fldCnt=DT.Cols.Count; for( i=0 ;i< fldCnt-1;i++) dataRow(i)=DT.Compute("Sum("+i.ToString()+")","true"); DT.Rows.Add(dataRow); 好了,大功告成。希望對大家有用。 ------------------------------------------------------------------------------------------- 在下面的例子中實現了3個Join方法,其目的是把兩個DataTable串連起來,相當於Sql的Inner Join方法,返回DataTable的所有列。 如果兩個DataTable中的DataColumn有重複的話,把第二個設定為ColumnName+"_Second",下面是代碼,希望對大家有所協助。 using System; using System.Data; CHINAZ namespace WindowsApplication1 { public class SQLOps { public SQLOps() { } public static DataTable Join (DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC) { //建立一個新的DataTable DataTable table = new DataTable("Join"); // Use a DataSet to leverage DataRelation using(DataSet ds = new DataSet()) CHINAZ CHINAZ { //把DataTable Copy到DataSet中 ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()}); CHINAZ DataColumn[] parentcolumns = new DataColumn[FJC.Length]; CHINAZ for(int i = 0; i < parentcolumns.Length; i++) { parentcolumns[i] = ds.Tables[0].Columns[FJC[i].ColumnName]; } DataColumn[] childcolumns = new DataColumn[SJC.Length]; for(int i = 0; i < childcolumns.Length; i++) { childcolumns[i] = ds.Tables[1].Columns[SJC[i].ColumnName]; CHINAZ CHINAZ } //建立關聯 DataRelation r = new DataRelation(string.Empty,parentcolumns,childcolumns,false); ds.Relations.Add(r); CHINAZ //為關聯表建立列 for(int i = 0; i < First.Columns.Count; i++) { table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType); } for(int i = 0; i < Second.Columns.Count; i++) { //看看有沒有重複的列,如果有在第二個DataTable的Column的列明後加_Second CHINAZ if(!table.Columns.Contains(Second.Columns[i].ColumnName)) table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType); else table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType); } table.BeginLoadData(); foreach(DataRow firstrow in ds.Tables[0].Rows) CHINAZ { //得到行的資料 DataRow[] childrows = firstrow.GetChildRows(r); if(childrows != null && childrows.Length > 0) { object[] parentarray = firstrow.ItemArray; foreach(DataRow secondrow in childrows) CHINAZ { object[] secondarray = secondrow.ItemArray; object[] joinarray = new object[parentarray.Length+secondarray.Length]; Array.Copy(parentarray,0,joinarray,0,parentarray.Length); Array.Copy(secondarray,0,joinarray,parentarray.Length,secondarray.Length); CHINAZ table.LoadDataRow(joinarray,true); } } } table.EndLoadData(); } return table; } public static DataTable Join (DataTable First, DataTable Second, DataColumn FJC, DataColumn SJC) CHINAZ { return Join(First, Second, new DataColumn[]{FJC}, new DataColumn[]{SJC}); } public static DataTable Join (DataTable First, DataTable Second, string FJC, string SJC) { return Join(First, Second, new DataColumn[]{First.Columns[FJC]}, new DataColumn[]{First.Columns[SJC]}); } } } |