C#datatable執行個體

來源:互聯網
上載者:User

一。建立一個記憶體表,下面的代碼會用到它
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位置,同時假設你的所有欄位都是可以求合計的。

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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.