DataTable使用技巧總結【轉】


        一、DataTable簡介    

 (1)構造函數
           DataTable()   不帶參數初始化DataTable 類的新實例。
           DataTable(string tableName) 用指定的表名初始化DataTable 類的新實例。
           DataTable(string tableName, string tableNamespace) 用指定的表名和命名空間初始化DataTable 類的新實例。
           (2) 常用屬性
           CaseSensitive    指示表中的字符串比較是否區分大小寫。
           ChildRelations   獲取此DataTable 的子關系的集合。
           Columns             獲取屬於該表的列的集合。
           Constraints        獲取由該表維護的約束的集合。
           DataSet               獲取此表所屬的DataSet。DataSet相關信息,可見我以前的一篇文章《數據訪問(2)-DataSet》
           DefaultView       獲取可能包括篩選視圖或游標位置的表的自定義視圖。
           HasErrors          獲取一個值,該值指示該表所屬的DataSet 的任何表的任何行中是否有錯誤。
           MinimumCapacity 獲取或設置該表最初的起始大小。該表中行的最初起始大小。默認值為 50。
           Rows                  獲取屬於該表的行的集合。
           TableName       獲取或設置DataTable 的名稱。

           (3)常用方法
           AcceptChanges()   提交自上次調用AcceptChanges() 以來對該表進行的所有更改。
           BeginInit()         開始初始化在窗體上使用或由另一個組件使用的DataTable。初始化發生在運行時。

           Clear()               清除所有數據的DataTable。
           Clone()              克隆DataTable 的結構,包括所有DataTable 架構和約束。
           EndInit()            結束在窗體上使用或由另一個組件使用的DataTable 的初始化。初始化發生在運行時。
           ImportRow(DataRow row)    將DataRow 復制到DataTable 中,保留任何屬性設置以及初始值和當前值。
           Merge(DataTable table) 將指定的DataTable 與當前的DataTable 合並。
           NewRow()         創建與該表具有相同架構的新DataRow。



        二、DataTable使用技巧

1)Create a DataTable
         DataTable dt = new DataTable("Table_AX");

      (2)Add columns for DataTable
        //Method 1
        dt.Columns.Add("column0", System.Type.GetType("System.String"));
        //Method 2
        DataColumn dc = new DataColumn("column1", System.Type.GetType("System.Boolean"));
        dt.Columns.Add(dc);

       (3)Add rows for DataTable
         //Initialize the row
         DataRow dr = dt.NewRow();
         dr["column0"] = "AX";
         dr["column1"] = true;
         dt.Rows.Add(dr);
         //Doesn't initialize the row
         DataRow dr1 = dt.NewRow();
         dt.Rows.Add(dr1);  

        (4)Select row
         //Search the second row 如果沒有賦值,則用is null來select
         DataRow[] drs = dt.Select("column1 is null");
         DataRow[] drss = dt.Select("column0 = 'AX'");

        (5)Copy DataTable include data
         DataTable dtNew = dt.Copy();

        (6)Copy DataTable only scheme
         DataTable dtOnlyScheme = dt.Clone();

        (7)Operate one row
         //對dt的操作
         //Method 1
         DataRow drOperate = dt.Rows[0];
         drOperate["column0"] = "AXzhz";
         drOperate["column1"] = false;
         //Method 2
         drOperate[0] = "AXzhz";
         drOperate[1] = false;
         //Method 3
         dt.Rows[0]["column0"] = "AXzhz";
         dt.Rows[0]["column1"] = false;
         //Method 4
         dt.Rows[0][0] = "AXzhz";
         dt.Rows[0][1] = false;

       (8)Evaluate another DataTable's row to current Datatable
         dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray);

       (9)Convert to string
         System.IO.StringWriter sw = new System.IO.StringWriter();
         System.Xml.XmlTextWriter xw = new System.Xml.XmlTextWriter(sw);
         dt.WriteXml(xw);
         string s = sw.ToString();

        (10)Filter DataTable
         dt.DefaultView.RowFilter = "column1 <> true";
         dt.DefaultView.RowFilter = "column1 = true";

        (11)Sort row
          dt.DefaultView.Sort = "ID ,Name ASC";
          dt=dt.DefaultView.ToTable();

         (12)Bind DataTable
           //綁定的其實是DefaultView
          gvTestDataTable.DataSource = dt;
          gvTestDataTable.DataBind();

         (13)judge the DataTable’s Column name is a string
          //判斷一個字符串是否為DataTable的列名
         dtInfo.Columns.Contains("AX");

         (14)DataTable convert to XML and XML convert to DataTable
          protected void Page_Load(object sender, EventArgs e)
          {
             DataTable dt_AX = new DataTable();
             //dt_AX.Columns.Add("Sex", typeof(System.Boolean));
             //DataRow dr = dt_AX.NewRow();
             //dr["Sex"] = true;
             //dt_AX.Rows.Add(dr);
             string xml=ConvertBetweenDataTableAndXML_AX(dt_AX);
             DataTable dt = ConvertBetweenDataTableAndXML_AX(xml);
         }
         public string ConvertBetweenDataTableAndXML_AX(DataTable dtNeedCoveret)
        {
             System.IO.TextWriter tw = new System.IO.StringWriter();
             //if TableName is empty, WriteXml() will throw Exception.                 

dtNeedCoveret.TableName=dtNeedCoveret.TableName.Length==0?"Table_AX":dtNeedCoveret.TableName;
             dtNeedCoveret.WriteXml(tw);
             dtNeedCoveret.WriteXmlSchema(tw);
             return tw.ToString();
        }
         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;
        }

 

我們在使用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位置,同時假設你的所有字段都是可以求合計的。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM