引言
可以說DataTable存放數據的一個離線數據庫,將數據一下加載到內存,而DataReader是在線查詢,而且只進形式的查詢,如果后退一步,就不可能了,DataTable操作非常方便,但也有缺點,數據量非常大的時候,一下加載到內存,可想而知會有多么的卡了。這里只是說明DataTable的select()方法,具體項目根據需求,可以自己選擇。
Select
既然DataTable是一下從數據庫中拿數據,肯定提供了更方便的篩選方法,然后就找了一下,覺得Select能滿足日常的篩選工作,做了一個小demo,測試了一下。

1 // 2 // 摘要: 3 // 獲取所有 System.Data.DataRow 對象的數組。 4 // 5 // 返回結果: 6 // System.Data.DataRow 對象的數組。 7 public DataRow[] Select(); 8 // 9 // 摘要: 10 // 獲取按與篩選條件相匹配的所有 System.Data.DataRow 對象的數組。 11 // 12 // 參數: 13 // filterExpression: 14 // 要用來篩選行的條件。 15 // 16 // 返回結果: 17 // System.Data.DataRow 對象的數組。 18 public DataRow[] Select(string filterExpression); 19 // 20 // 摘要: 21 // 獲取按照指定的排序順序且與篩選條件相匹配的所有 System.Data.DataRow 對象的數組。 22 // 23 // 參數: 24 // filterExpression: 25 // 要用來篩選行的條件。 26 // 27 // sort: 28 // 一個字符串,它指定列和排序方向。 29 // 30 // 返回結果: 31 // 與篩選表達式相匹配的 System.Data.DataRow 對象的數組。 32 public DataRow[] Select(string filterExpression, string sort); 33 // 34 // 摘要: 35 // 獲取與排序順序中的篩選器以及指定的狀態相匹配的所有 System.Data.DataRow 對象的數組。 36 // 37 // 參數: 38 // filterExpression: 39 // 要用來篩選行的條件。 40 // 41 // sort: 42 // 一個字符串,它指定列和排序方向。 43 // 44 // recordStates: 45 // System.Data.DataViewRowState 值之一。 46 // 47 // 返回結果: 48 // System.Data.DataRow 對象的數組。 49 public DataRow[] Select(string filterExpression, string sort, DataViewRowState recordStates);
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace Wolfy.DatatableSelect 12 { 13 public partial class MainForm : Form 14 { 15 public MainForm() 16 { 17 InitializeComponent(); 18 } 19 DataTable dt = null; 20 DataTable d = null; 21 private void btnSearch_Click(object sender, EventArgs e) 22 { 23 string where = string.Empty; 24 if (ckMan.Checked) 25 { 26 where += "性別='男'"; 27 } 28 else 29 { 30 where = string.Empty; 31 } 32 if (ckCotainsW.Checked) 33 { 34 where += ckMan.Checked ? " and 姓名 like '%w%'" : "姓名 like '%w%'"; 35 } 36 37 DataRow[] rows = dt.Select(where); 38 richTextResult.AppendText("編號\t姓名\t性別\t年齡\t\r\n"); 39 for (int i = 0; i < rows.Length; i++) 40 { 41 ShowSearchResult(rows[i]); 42 } 43 44 45 46 47 } 48 private void ShowSearchResult(DataRow row) 49 { 50 richTextResult.AppendText(string.Format("{0}\t{1}\t{2}\t{3}\t\r\n", row[0], row[1], row[2], row[3])); 51 } 52 private void MainForm_Load(object sender, EventArgs e) 53 { 54 dt = new DataTable(); 55 DataColumn cell1 = new DataColumn("編號"); 56 cell1.DataType = typeof(System.Int32); 57 DataColumn cell2 = new DataColumn("姓名"); 58 cell2.DataType = typeof(System.String); 59 DataColumn cell3 = new DataColumn("性別"); 60 cell3.DataType = typeof(System.String); 61 DataColumn cell4 = new DataColumn("年齡"); 62 cell4.DataType = typeof(System.Int32); 63 dt.Columns.AddRange(new DataColumn[] { cell1, cell2, cell3, cell4 }); 64 65 Random ran = new Random(); 66 string[] gender = { "男", "女", "保密" }; 67 string[] names = { "韓梅梅", "wolfy", "小米", "w3w" }; 68 for (int i = 0; i < 20; i++) 69 { 70 int index = ran.Next(0, 3); 71 DataRow row = dt.NewRow(); 72 row[0] = i; 73 row[1] = names[ran.Next(0, 4)] + i.ToString(); 74 75 row[2] = gender[index]; 76 row[3] = ran.Next(10, 50); 77 dt.Rows.Add(row); 78 } 79 dgView.DataSource = dt; 80 } 81 82 83 } 84 }
測試結果
總結
用select方法進行篩選還是非常方便的,以前的本方法就是遍歷,然后將符合條件的數據取出,很麻煩。