使用DataTable类的搜索和筛选功能 DataTable类公开了两个方法:Find和Select Find方法:可以根据主键来查找数据行。Select方法:更类似于筛选器,根据更灵活的搜索条件返回多个数据行 在查询数据库获取信息时,假如使用如下SQL查询: select CustomerID,CompanyName,ContactName,Phone from Customers where CustomerID = 'Alen' 这个查询是根据主键来查询的,可以在ADO.NET中使用Find方法,根据主键值在DataTable中查找DataRow。 Find方法返回一个DataRow,就算有多个DataRow符合查询的要求,也只会返回第一个符合要求的DataRow。 使用示类:
string strConn, strSQL;//数据库连接字符串,和查询语句 strConn = "...."; strSQL = "...."; SqlDataAdapter da = new SqlDataAdapter(strSQL,strConn); DataTable tb1 = new DataTable("Customers"); da.Fill(tb1); tb1.PrimaryKey = new DataColumn[] { tb1.Columns["CustomerID"] }; DataRow row = tb1.Rows.Find("Alen"); Console.WriteLine(row["CompanyName"]);
DataTable类的Select方法根据类似的条件查找行。 假如希望查找下面SQL语句: select CustomerID,CompanyName,ContactName,Phone from Customers where Country = 'USA' and City <> 'Seattle' 这个复杂的条件查询,我们要是假设DataTable中数据也是要完成这样的查询,可以使用Select方法来完成,使用实例:
SqlDataAdapter da1 = new SqlDataAdapter(strSQL, strConn); DataTable tb2 = new DataTable("Customers"); da.Fill(tb1); string strFilter = "Country = 'USA' and City <> 'Seattle'"; foreach (DataRow r in tb2.Select(strFilter)) { Console.WriteLine(r["CompanyName"]); }
可以看出来select方法还是很重要的,我们来做个select的用法步骤归纳: 1、先确定要筛选的目标结果 2、写出对应的SQL语句,能在数据库中运行,并得到想要的结果 3、把这个表的数据,用SqlDataAdapter的Fill方法缓存到内存的DataTable中 4、把SQL语句的Where部分提取出来赋值给strFilter字符串 5、调用Select方法:DataRow[] = tb2.Select(strFilter);会返回相应的结果集
*有时候我们需要对结果排序,用SQL语句就很简单: *升序: *select CustomerID,CompanyName,ContactName,Phone from Customers order by City *降序: *select CustomerID,CompanyName,ContactName,Phone from Customers order by City desc *重载的Select方法可以接受一个排序顺序,使用实例:
string strFilter1 = "Country = 'USA' and City <> 'Seattle'"; string strSort = "City Desc"; foreach (DataRow r in tb2.Select(strFilter1, strSort)) { Console.WriteLine(r["CompanyName"]); }
我们来做个select的用法步骤重新总结: 1、先确定要筛选的目标结果 2、写出对应的SQL语句,能在数据库中运行,并得到想要的结果 3、把这个表的数据,用SqlDataAdapter的Fill方法缓存到内存的DataTable中 4、把SQL语句的Where部分提取出来赋值给strFilter字符串,Order by部分提取出来给strSort字符串 5、调用Select方法:DataRow[] = tb2.Select(strFilter, strSort);会返回相应的结果集
DataView对象的出现 DataTable的Select方法功能强大而且很灵活,但是它还是有一些限制。 首先,这个动态的查询效率不高。然后Windows和Web不支持绑定到DataRow数组。 于是DataView对象出现了,可以很好的解决这些限制 DataView对象从DataTable中返回数据,数据库中的视图也是这个特性 DataView对象可以用来筛选、排序和搜索DataTable的数据,但是他们并非SQL查询。 不能用DataView来连接两个DataTable对象之间的数据。 DataView对象的确支持根据动态的条件筛选行,但是他们仅能访问一个DataTable,并且DataTable中的所有列都可以通过DataView得到 创建DataView对象 使用DataView来查看DataTable中的数据就必须将他和DataTable对象关联起来,有以下两个方法:
DataTable tb3 = new DataTable("Customers"); DataView vue;
//方法1,使用这个方法要注意一个问题,所关联的tb3的TableName必须是自己重新指定的,默认是不行的 vue = new DataView(); vue.Table = tb3; //方法2 vue = new DataView(tb3);
DataView对象还有一个构造函数,其签名与DataTable对象的Select方法非常匹配, 一个复杂的构造函数在一行代码中设置了DataView的Table、RowFilter、Sort和RowStateFilter等属性 使用实例:
//分别设置Table、RowFilter、Sort和RowStateFilter等属性 vue.Table = tb3; vue.RowFilter = strFilter1; vue.Sort = strSort; vue.RowStateFilter = DataViewRowState.ModifiedCurrent;
//一个复杂的构造函数 vue = new DataView(tb3, strFilter1, strSort,DataViewRowState.ModifiedCurrent);
使用DataRowView来查看DataView中的数据 DataView对象还公开了Count属性,可以看到DataView的行数 使用实例:
foreach (DataRowView rView in vue) { Console.WriteLine(rView["CompanyName"]); }
在DataView中搜索数据 我们前面已经使用了RowFilter和RowStateFilter属性来支持搜索的,DataView还支持Find和FindRows方法搜索 Find方法使用说明:一旦设置了DataView中的Sort属性,就可以调用它的Find方法,根据Sort属性中所指示的列来查找。 DataView的Find方法不返回DataRow或者是DataRowView对象,他会返回的是一个整型值,该值是对应于所在行的DataView的索引。如果没有就返回-1 Find方法使用实例:
vue = new DataView(tb3); vue.Sort = "City"; int intIndex = vue.Find("Fran Wilson"); Console.WriteLine(vue[intIndex]["CompanyName"]); //使用FindRows方法 vue = new DataView(tb3); vue.Sort = "City"; DataRowView[] arows = vue.FindRows("Fran"); foreach (DataRowView rr in arows) { Console.WriteLine(rr["CompanyName"]); }
修改DataRowView对象 用DataRowView对象修改一行数据类似于修改DataRow对象的内容。与DataRow类一样,DataRowView对象也公开了BeginEdit,EndEdit,CancelEdit 和Delete方法,用DataRowView对象创建新数据行与创建新DataRow有一点不同。DataView有一个AddNew方法,该方法返回一个新的DataRowView 直到DataRowView对象调用EndEdit方法,新行才被真正地创建到DataTable中,使用实例:
//添加一新行 DataRowView rowView = vue.AddNew(); rowView["CustomerID"] = "asdf"; rowView.EndEdit(); //修改一行 rowView.BeginEdit(); rowView["CustomerID"] = "刘明丰"; rowView.EndEdit(); //删除一行 rowView.Delete();
使用DataView创建新的DataTable 使用实例
DataTable newTable = vue.ToTable("CreateNewTable");
来自:http://www.cnblogs.com/lmfeng/archive/2012/02/02/2335876.html#2301857