1. DataTable类的搜索和筛选功能
l 根据主键值查找行
DataRowCollection类的Find方法,接受包含要查找行的主键值为参数,因为是根据主键值查找,所以仅返回一个DataRow。
DataTable tbl=new DataTable(“Customers”);
da.Fill(tbl);
tbl.PrimaryKey=new DataColumn[] {tbl.Columns[“CustomerID”]};
DataRow row=tbl.Rows.Find(“ALFKI”);
if((row<>null)
consol.WriteLine(…);
如果主键为复合键,则应将一个对象数组传递给Find方法,其中数组中的项对应于包含该主键的DataColumn。
tbl.PrimaryKey=new DataColumn[] {tbl.Columns[“OrderID”],
tbl.Columns[“ProductID”]};
Object[] objCriteria=new object[] {10643,28}; //object对象数组
DataRow row=tbl.Rows.Find(objCriteria);
l 执行动态的复杂搜索-Select方法
DataTable类的Select方法接受类似于SQL查询中的Where条件语句为参数,返回DataRowCollection对象。
DataTable tbl=new DataTable(“Customers”);
da.Fill(tbl);
sting strFilter;
strFilter=”Country=’USA’ and City <>’Seattle’”;
foreach(DataRow row in tbl.Select(strFilter))
Consol.WriteLine(…);
Select方法的参数字符串接受使用*或%作为通配符进行模糊查询,例如”State like ‘New%’”查找State字段以”New”开头的数据行。另外如果搜索字符串中涉及日期,其值用双#包含而不使用双单引号。
重载的Select 方法可包含第二个参数,控制搜索结果行的排序顺序。
strSortOrder=”City DESC” ;//搜索结果按City字段降序排列
tbl.Select(strFilter,strSortOrder);
重载的Select方法亦可包含第三个参数,指定DataViewRowState枚举的一个值,控制Select方法仅搜索指定状态的DataRow。
DataViewRowState dvrs=DataViewRowState.ModifiedCurrent;
tbl.Select(“”,””,dvrs);//前二个参数为空,仅使用第三个参数
2. DataView对象
DataTable对象的Select方法功能强大,但执行效率不高,而且Windows和Web窗体不支持绑定Select方法的返回值-DataRow对象数组。DataView对象解决了以上两点不足。DataView对象不维护自己的数据附本,当通过DataView访问数据时,它将返回存储在相应DataTable中的数据。
l 创建DataView对象
DataView对象必需与DataTable对象相关联,以下几种构造函数可以创建DataTable对象并与DataTable相关联。
DataTable tbl=new DataTable(“MyTable”);
DataView vue;
vue=new DataView();
vue.Table=tbl;
或 vue=new DataView(tbl);
DataView还有一个复杂的构造函数,可以设置Table、RowFilter、Sort和RowStateFilter属性,示例代码如下:
vue.Table=tbl;
vue.RowFilter=”Country=’USA’”;
vue.Sort=”City DESC”;
DataViewRowState dvrs=DataViewRowState.ModifiedOriginal;
vue.RowStateFilter=dvrs; //仅查看修改过的行的原始值
或 vue=new DataView(tbl,”Country=’USA’”,”City DESC”,dvrs);
DataView类的Count属性,返回可以通过DataView看到的数据行数。
l DataRowView类
DataTable类通过DataRow对象访问数据项;DataView类通过DataRowView对象访问数据项,其功能与DataRow类似。
DataView vue=new DataView(tbl);
DataRowView row=vue[0];
Console.WriteLine(row[“CompanyName”]);
l DataView中搜索数据
DataView类通过RowFilter和RowStateFilter属性支持筛选,它还支持通过Find和FindRows方法搜索,其用法与DataTable类的Find方法类似。
Find方法
设置DataView对象的Sort属性后,根据Sort属性所指定的列来调用Find方法,提供一个值或一组值作为参数。Find方法的返回值是一个整型值,代表查找到的行所在DataVier中的索引,如果没查找到符合条件的值,则返回-1。
DataView vue=new DataView(tbl);
vue.Sort=”ContactName”;
int intIndex=vue.Find(“Fran Wilson”);
if(intIndex<>-1)
Consol.WriteLine(vue[intIndex][“CompanyName”]);
FindRows方法
DataTable的Find方法根据DataTable对象的PrimayKey属性中所指定的列进行搜索,所以至多返回一条符合条件的数据行。DataView的Find方法根据Sort属性所指定的列进行搜索,可能有多个符合条件的值,但其只返加一个符合条件的索引值。
DataView类提供FindRows方法来处理其返回的多个数据行,FindRows方法返回符合搜索条件的DataRowView对象数组。
DataView vue=new DataView(tbl);
vue.Sort=”Country”;
DataRowView[] aRows=vue.FindRows(“Spain”);
if(aRows.Length==0)
Consol.WriteLine(“No rows Find”);
l 修改DataRowView对象
DataRowView修改DataView的一行数据类似DataRow修改DataTable的一行数据,DataRowView对象也有BeginEdit、EndEdit、CancelEdit和Delete方法。
DataRowView的AddNew方法返回一个新的DataRowView对象,但只到其调用EndEdit方法后,新行才被真正的添加到相应的DataTable中。
DataView vue=new DataView(tbl);
DataRowView row=vue.AddNew();
row[“……”]=”…”;
…
row.EndEdit();
l DataView创建DataTable
DataView类的ToTable方法返回一个DataTable对象,其中仅包括DataView的RowFilter属性设置可见的行。
DataTable tblAllCustomers=new DataTable(“Customers”);
DataView vue=new DataView(tblAllCustomers);
vue.RowFilter=”Country=’Spain’”;
DataTable tblSpanishCustomers=vue.ToTable(“SpanishCustomers”);
以上代码由DataView创建的DataTable将包含DataView中所有列,可以通过DataView的ToTable的重载方法来控制生成的DataTable所包含的列。
DataTable tblSpanishCustomers;
tblSpanishCustomers=vue.ToTable(“SpanishCustomers”,true,
new string[] {“City”,”Country”});
其中第二个参数代表是否返回的新列组合的结果集是否是唯一值。相当于SQL查询中的distinct的功能。