您的位置:首页 > 其它

ADO.NET的记忆碎片(七)

2012-02-19 20:00 183 查看
使用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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: