引言
可以说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("编号 姓名 性别 年龄 "); 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} {1} {2} {3} ", 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方法进行筛选还是非常方便的,以前的本方法就是遍历,然后将符合条件的数据取出,很麻烦。