DataTable排序,檢索,合併詳解

DataTable排序,檢索,合併詳解

一、排序
1 獲取DataTable的默認視圖
2 對視圖設置排序表達式
3 用排序後的視圖導出的新DataTable替換就DataTable
(Asc升序可省略,多列排序用","隔開)

一、重生法
dstaset.Tables.Add(dt)
dataset.Tables(0).DefaultView.Sort = "id desc"

二、直接法
dv = New DataView(dt)
dv.Sort = "id desc"
dt = dv.ToTable();

三、間接法
dv = New DataView(ds.Tables[0])
dv.Sort = "id desc"

dt = dv.ToTable();

二、檢索
1 設置查詢字符串
2 使用Select方法獲取到所有滿足條件的數據行對象數組 (多項查詢條件間,用and隔開)

DataRow[] matches = dt.Select("id<'003' and name='名字11'");
string strName = matches[0]["name"].ToString();

三、合併
假定有2個DataTable:Dt1 , Dt2。表結構一樣
將Dt2接在Dt1後可採用此方法

dt1.Merge(dt2);

在DataTable中查詢應該注意的問題
【簡 介】
完成一個查詢,返回一個DataTable後,很多時候都想在查詢結果中繼續搜索。這時可以使用DataTable.Select方法對結果進行再查詢

完成一個查詢,返回一個DataTable後,很多時候都想在查詢結果中繼續搜索。這時可以使用DataTable.Select方法對結果進行再查詢。

Select方法有4個重載,我們經常用到的就是DataTable.Select(String)

這個String的參數是查詢的限定式。相當於SQL查詢語言中的WHERE語句(不含WHERE),其語法符合SQL語言語法。

Select方法的返回的是包含查詢到的數據的DataRow,但是這個DataRow只是被查詢的DataTable的一個映射,所以DataRow是隨着DataTable的行變化而變化的。例如,DataTable的行都被刪除了,那麼DataRow中的數據同樣被刪除了(即便是先Select,再刪除的)

所以,要想把返回的DataRow放進數據顯示控件中,需要將其放入另一個DataTable中,如果直接放入原DataTable或將原DataTable的行全部清除再放入查詢所得的數據都是不行的,程序會顯示錯誤,錯誤提示是“表中已有此行”。

另外,在一個新表中插入行,不能直接用DataTable.Rows.Add(DataRow)的方式,因爲這樣是插入一個新表,也就是DataRow是空的。要用導入行的方式,DataTable.ImportRow(DataRow)。當然,前提是這個新表要有與原數據表一樣的結構。

1Public Function SDEResearch(ByVal InputDT As DataTable, ByVal SearchStr As String) As DataTable
2
3 '用來存儲再查詢後的數據表
4 Dim ReSearchDT As DataTable = InputDT.Clone() '保證有與源數據表相同的表結構
5
6 '用來存儲查詢後返回的datarow數組
7 Dim ReSearchDR() As DataRow = Nothing
8
9 Try
10 ReSearchDR = InputDT.Select("NAME LIKE '%" + SearchStr + "%'") '只是從數據表中映射出來datarow(),所以不能刪除原表中的行
11 Catch ex As Exception
12 Return Nothing
13 End Try
14
15 For i As Int16 = 0 To ReSearchDR.Length - 1
16 ReSearchDT.ImportRow(ReSearchDR(i))
17 Next
18
19 Return ReSearchDT
20 End Function


附:篩選DataTable數據的方法
對DataTable進行過濾篩選的一些方法Select,dataview

當你從數據庫裏取出一些數據,然後要對數據進行整合,你很容易就會想到:

DataTable dt = new DataTable();//假設dt是由"SELECT C1,C2,C3 FROM T1"查詢出來的結果
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i]["C1"].ToString() == "abc")//查詢條件
{
//進行操作
}
}
但這種做法用一兩次還好說,用多了就累了。那有沒有更好的方法呢?記得LinQ是可以直接對DataTable進行查詢操作的,那在.Net Framework 2.0裏,有沒有類似的方法呢?答案是肯定的,就是dt.Select(),上面的操作可以改成這樣:

DataRow[] drArr = dt.Select("C1=’abc’");//查詢
還可以這樣操作:

DataRow[] drArr = dt.Select("C1 LIKE ’abc%’");//模糊查詢
DataRow[] drArr = dt.Select("’abc’ LIKE C1 + ’%’", "C2 DESC");//另一種模糊查詢的方法
DataRow[] drArr = dt.Select("C1=’abc’", "C2 DESC");//排序
問題又來了,如果要把DataRow賦值給新的DataTable,怎麼賦值呢?你可能會想到:

DataTable dtNew = dt.Clone();
for (int i = 0; i < drArr.Length; i++)
{
dtNew.Rows.Add(drArr[i]);
}
但這樣程序就會出錯,說該DataRow是屬於其他DataTable的,那要怎麼做呢?很簡單,這樣就可以解決了:

DataTable dtNew = dt.Clone();
for (int i = 0; i < drArr.Length; i++)
{
dtNew.ImportRow(drArr[i]);
}
這樣就完成了。

3.5裏的DataRow[]有個擴展方法CopyToDataTable()

/*
* 補充一下,還可以利用DataView來達到檢索的目的。
*/
DataTable dataSource = new DataTable();
DataView dv = dataSource.DefaultView;
dv.RowFilter = "columnA = 'abc'";
//1.過濾後直接獲取DataTable
DataTable newTable1 = dv.ToTable();
//2.設置新DataTable的TableName
DataTable newTable2 = dv.ToTable("NewTableName");
//3.設置新表是否過濾重複項,擁有的列的列名以及出現的順序
//即可以設置新表的字段。但是字段名肯定是老表dataSource中擁有的。
DataTable newTable3 =
dv.ToTable(true, new string[] { "columnA,columnF,columnC" });
//4.綜合了2.3兩點。
DataTable newTable4 =
dv.ToTable("NewTableName", true, new string[] { "columnA,columnF,columnC" });

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章