1. 程式人生 > >DataTable--可能你不知道的一些功能(排序、查詢、合併操作)

DataTable--可能你不知道的一些功能(排序、查詢、合併操作)

寫在前面的:

本來是想寫一些關於串列埠執行緒的東西的。但是由於自己現在處於專案開發的階段。最近隨著自己對這個專案的不斷的認識,以及對出現的問題的不斷的研究與學習。發現自己對串列埠中執行緒的應用的理解有所偏差。本著對讀者負責的原則。我決定推遲對這塊研究成果的發表。先說一些在我的專案中也是比較的重要的知識點。

今天要給大家說是關於DataTable的一些比較少用的功能,我們所用到的DataTable,通常是作為從資料庫中查的的返回的結果;或者是在程式碼中自己新建的DataTable,手動的然後新增一些資料,作為程式中的一個數據倉庫進行處理、傳遞。今天要給大家講的當然也是對於DataTable的一些操作,當然也是一些比較常用的操作。但我的這篇文章一定對大多數人來說,是非常受益的。

進入正文:

一、Merge方法:

在記憶體中將兩個DataTable合併,存在兩種情況1>.表結構相同。2>.表結構不同。

1>.表結構相同

如果兩個表的表結構相同則將這兩個表的資料合併。

	DataTable dt1 = new DataTable(); 
	dt1.Columns.Add("student_no");
	dt1.Columns.Add("student_name");
	dt1.Rows.Add("001", "June");
	dt1.Rows.Add("002", "zhang");
	dt1.Rows.Add("003", "jun");
	DataTable dt2 = new DataTable(); 
	dt2 .Columns.Add("student_no");
	dt2 .Columns.Add("student_name");
	dt2 .Rows.Add("111", "ABC");
	dt2 .Rows.Add("222", "XYZ");
	dt2 .Rows.Add("333", "OPQ");
	DataTable dt3 = dt1.Copy(); 
	dt3.Merge(dt2);

    dt3的表內資料為:


2>.表結構不同:

    如果兩個表的表結構不同但有相同的主鍵。則執行兩個表的連線類似jone

	DataTable dt1 = new DataTable(); 
	dt1.Columns.Add( "ID", typeof(int)); 
	dt1.Columns.Add( "Name", typeof(string)); 
	dt1.PrimaryKey = new DataColumn[] { dt1.Columns[0]}; 
	dt1.Rows.Add(1, "Age "); 
	dt1.Rows.Add(2, "Apple "); 
	dt1.Rows.Add(3, "Orange "); 
	
	DataTable dt2 = new DataTable(); 
	dt2.Columns.Add( "ID", typeof(int)); 
	dt2.Columns.Add( "Price", typeof(decimal)); 
	dt2.PrimaryKey = new DataColumn[] { dt2.Columns[0] }; 
	dt2.Rows.Add(1, 10); 
	dt2.Rows.Add(2, 6); 
	dt2.Rows.Add(3, 7); 
	
	DataTable dt3 = dt1.Copy(); 
	dt3.Merge(dt2);

    dt3的表內資料為:

    如果dt2中沒有dt1中對應的資料,如id為2的資料為空,則結果為:


二、查詢Select

    對於大部分人來說使用Select方法,好像都面對的資料庫,對資料庫中的資料進行查詢。而我們常說DataTable是在記憶體中的一張表,我們當然能對他進行操作了。

	DataRow[] dataRows = dataTable.Select("條件");

    注意DataTableSelect函式中我們需要提供的是我們的查詢條件。即我們通常寫sql語句中的Where後的語句。如對上面的操作最後加上

	DataRow[] dataRows = dt3.Select("ID =1");
	string str = dataRows[0]["Price"].ToString();
	MessageBox.Show(str);

         實現的結果:


    當然也可以在篩選條件中傳入引數:

	int id; 
	string name;
	DataRow[] dataRows = dataTable.Select(string.Format(@"id={0} and name={1}",id,name));

三、排序

    當然你可能會說在獲取DataTable之前,先排序後填充,但是往往有些時候是不能做到這一點的。這時候,就用到了DataTable的排序。

1>.利用查詢排序

	DataRow[] dataRows = dataTable.Select("條件", "id asc"); //一列排序
	DataRow[] dataRows = dataTable.Select("條件", "id asc,name asc,..."); //或多列排序 
	DataRow[] dataRows = dataTable.Select("恆為True的表示式,如1=1", "id asc,name asc,...");//對所有的進行排序 

    說明:

  1. select方法如同sql語句對單表的查詢,條件如同sql語句的where之後的部分,>,<,=,LIKE等都可以使用。
  2. “ASC”(升序)或“DESC”(降序)

    如在上面查詢的程式碼中加入:

 DataRow[] dataRows = dt3.Select("ID >0", "ID desc");
            string str = dataRows[0]["Price"].ToString();
            MessageBox.Show(str);

實現的結果:


2>.預設檢視排序:使用DataViewSort屬性

    作用:獲取或設定 DataView的一個或多個排序列以及排序順序。

    屬性:一個字串,它包含列名,後跟“ASC”(升序)或“DESC”(降序)。在預設情況下列按升序排序。多個列可用逗號隔開。

	DataView dataView = dataTable.DefaultView;
	dataView.Sort = "id desc";
	dataTable = dataView.ToTable();

實現的結果:


         Totable方法:就是把檢視重新轉換為DataTable

3>.另外說明DataView的另一個很重要的屬性RowFilter

    作用:使用RowFilter屬性動態篩選記錄,從DataTable物件中獲取符合該屬性指定條件的資料作為DataView物件的資料,若不設定該項,則獲取DataTable物件中的所有資料作為DataView物件中的資料。

RowFilter中的查詢語句與前面介紹過的DataTable物件的SELECT()方法的語法一致。例如:

dataView.RowFilter = "ID =1'";