ADO.NET的记忆碎片(七)

使用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");

posted @ 2012-02-02 15:41  八神吻你  阅读(3021)  评论(10编辑  收藏  举报