C#数据库开发读书笔记4---DataView的使用

1、创建DataView

创建DataView的方法有两种,可以使用DataView构造函数,也可以创建对DataTable的DefaultView属性

的引用。DataView构造函数可以为空,也可以通过单个参数的形式采用DataTable或者同时采用DataTable

与筛选条件、排序条件和行状态筛选器。

在创建DataView时或者在修改任何Sort、RowFilter或RowStateFilter属性时,都会生成DataView的索引,

所以当创建DataView时,通过以构造函数参数的形式提供任何初始排序顺序或筛选条件,将实现最佳性能。

//一下代码使用DataView构造函数创建DataView。RowFilter、Sort和DataViewRowState将与DataTable一起提供

DataView custDV = new DataView(custDS.Tables["Customers"], "Country = ‘USA‘",

"ContactName", DataViewRowState.CurrentRows);

//以下代码使用该表的DefaultView属性获取对DataTable的默认DataView的引用。

DataView custDV = custDS.Tables["Customers"].DefaultView;

2、使用DataView对数据排序和筛选

DataView提供了几项用于对DataTable中的数据进行排序和筛选的功能。

使用Sort属性,可以指定单个或多个列排序顺序并包含升序ASC和降序DESC参数。

可以使用ApplyDefaultSort属性自动以升序创建基于表的一个或多个主键列的排序。只有当Sort属性为空

或空字符串时,或者已定义主键时,ApplyDefaultSort才适用。

使用RowFilter属性,可以根据行的列值来指定行的子集。

如果要返回对数据特定查询的结果(而不是提供数据子集的动态视图)以实现最佳性能,需要使用DataView的Find

或FindRows方法,而不是设置RowFilter属性。设置RowFilter会使数据重新生成索引。

//示例代码:该视图显示所有库存量小于或等于再订购量的产品,这些产品首先按SupplierID排序,然后再按ProductName排序

DataView prodView = new DataView(prodDS.Tables["Products"], "UnitsInStoc <= ReorderLevel",

"SupplierID, ProductName", DataViewRowState.CurrentRows);

3、使用DataView查看数据

3.1、查看DataView内容

当使用DataView查看时,DataView的RowStateFilter属性将确定公开基础DataRow的哪一个行版本。

//以下代码显示一个表中所有当前值和初始值

DataView catView = new DataView(catDS.Tables["Categories"]);

Console.WriteLine("Current Values");

WriteView(catView);

Console.WriteLine("Original Values");

catView.RowStateFilter = DataViewRowState.ModifiedOriginal;

WriteView(catView);

public static void WriteView(DataView myView)

{

foreach (DataRowView myDRV in myView)

{

for (int i = 0; i < myView.Table.Columns.Count; i++)

{

Console.Write(myDRV[i] + "\t");

}

Console.WriteLine();

}

}

3.2、搜索DataView内容

使用DataView的Find和FindRows方法,可以按照行的排序关键字值来对行进行搜索。

Find方法返回一个整数,该整数表示匹配搜索条件的DataRowView的索引。如果多个行匹配搜索条件,

则只返回第一个匹配DataRowView的索引。如果未找到将返回-1。

如果返回匹配多个行的搜索结果,可以使用FindRows方法。FindRows的工作方式与Find方法类似,不同

的只是FindRows返回引用DataView中所有匹配行的DataRowView数组。如果未找到匹配项,DataRowView

数组为空。

如果使用Find或FindRows方法,必须通过将ApplyDefaultSort设置为true或通过使用Sort属性来指定排序顺序,

如果未指定排序顺序,则将引发异常。

Find和FindRows方法将一个值数组用作输入,该数组的长度与排序顺序包含的列数组匹配。在对单个列进行排序

的情况下,可以传递单个值。对于包含多个列的排序顺序,可传递一个对象数组。

//当对多个列进行排序时,对象数组中的值必须匹配在DataView的Sort属性中指定的列的顺序。

//以下代码对具有单个列排序顺序的DataView调用Find方法。

DataView custView = new DataView(custDS.Tables["Customers"], "", "CompanyName",

DataViewRowState.CurrentRows);

int rowIndex = custView.Find("The Cracker Box");

if (rowIndex == -1)

{

Console.WriteLine("没有匹配的结果");

}

else

{

Console.WriteLine("{0}, {1}", custView[rowIndex]["CustomerID"].ToString(),

custView[rowIndex]["CompanyName"].ToString());

}

//以下代码对多个列排序顺序的DataView调用Find方法,如果Sort属性指定多个列,则必须按

//Sort属性指定的顺序为每个列传递包含搜索值得对象数组

DataView custView = new DataView(custDS.Tables["Customers"], "", "CompanyName,

ContactName", DataViewRowState.CurrentRows);

DataRowView[] foundRows = custView.FindRows(new object[]{"The Cracker Box", "Liu Wong"});

if (foundRows.Length == 0)

{

Console.WriteLine("没有匹配的结果");

}

else

{

foreach (DataRowView myDRV in foundRows)

{

Console.WriteLine("{0}, {1}", myDRV["CompanyName"].ToString(),

myDRV["CompanyName"].ToString());

}

}

3.3、使用DataView进行关系导航

如果DataSet中的表之间存在关系,则可以使用DataRowView的CreateChildView方法为父表中的行创建一个DataView,

该DataView包含来自相关子表的行。

//例如,以下代码按CategoryName和ProductName的字母顺序来排序Categories及其相关Products。

DataTable catTable = catDS.Tables["Categories"];

DataTable prodTable = catDS.Tables["Products"];

//创建Categories表和Products表间的关系

DataRelation catProdRel = catDS.Relations.Add("CatProdRel", catTable.Columns["CategoryID"],

prodTable.Columns["CategoryID"]);

//创建Categories表和Products表的DataView

DataView catView = new DataView(catTable, "", "CategoryName", DataViewRowState.CurrentRows);

DataView prodView;

//遍历Categories表

foreach (DataRowView catDRV in catView)

{

Console.WriteLine(catDRV["CategoryName"]);

//创建产品记录的子视图

prodView = catDRV.CreateChildView(catProdRel);

prodView.Sort = "ProductName";

foreach (DataRowView prodDRV in prodView)

{

Console.WriteLine("\t" + prodDRV["ProductName"]);

}

}

4、使用DataView修改数据

默认情况下,DataView是数据的只读视图,但是可以使用DataView来添加、删除、或修改基础表中的数据行,

方法是设置DataView的3个Boolean属性之一。这些属性为AllowNew、AllowEdit、AllowDelete。

//示例代码

DataTable custTable = custDS.Tables["Customers"];

DataView custView = custTable.DefaultView;

custView.Sort = "CompanyName";

custView.AllowDelete = false;

DataRowView newDRV = custView.AddNew();

newDRV["CustomerID"] = "ABCDE";

newDRV["CompanyName"] = "ABC Products";

newDRV.EndEdit();

5、使用DataView事件

可以使用DataView的ListChanged事件来确定视图是否已经由于一下原因而被更新:添加、删除或修改基础表中的行;

ListChanged事件还将通知所查看的行列表是否已经由于应用新的排序顺序或筛选器而发生重大更改。

//示例代码:如何添加ListChanged事件处理程序

custView.ListChanged += new System.ComponentModel.ListChangedEventHander(OnListChanged);

//ListChanged事件定义

protected static void OnListChanged(object sender, System.ComponentModel.ListChangedEventArgs args)

{

Console.WriteLine("ListChanged:");

Console.WriteLine("\t Type = " +args.ListChangedType);//改变的类型

Console.WriteLine("\t OldIndex = " +args.OldIndex);//旧地索引

Console.WriteLine("\t NewIndex = " +args.NewIndex);//新的索引

}

6、使用DataViewManager设置默认表视图

DataViewManager用来管理DataSet中所有表的视图设置。DataViewManager适合应用于有一个控件要绑定到多个表的情况。

DataViewManager包含DataViewSetting对象的集合,这些对象用于设置DataSet中各个表的视图设置。对于DataSet中的

每个表,DataViewSettingCollection都包含一个DataViewSetting对象,可以使用所引用表的DataViewSeting来设置该表

的默认ApplyDefaultSort、Sort、RowFilter和RowStateFilter属性;可以按名称或序号引用或通过向特定表对象传递引用该特定

表的DataViewSetting;可以使用DataViewSetting属性来访问DataViewManager中DataViewSetting对象的集合。

//以下代码示例使用SQL Server的Noerthwind数据库Customers表、Orders表和Order Details表来填充DataSet,并创建表

//之间的关系,使用DataViewManager设置默认DataView设置,并将DataGrid绑定到DataViewManager。该示例将DataSet中

//多有表的默认DataView设置按表的主键进行排序(ApplyDefaultSort = true),然后将Customers表的排序顺序修改为按CompanyName排序。

//创建Connection,DataAdapter和DataSet

SqlConnection nwindConn = new SqlConnection("……");

SqlDataAdapter custDA = new SqlDataAdapter("select CustomerID, CompanyName from Customers", nwindConn);

SqlDataAdapter orderDA = new SqlDataAdapter("select OrderID, CustomerID from Orders", nwindConn);

SqlDataAdapter ordDetDA = new SqlDataAdapter("select OrderID, ProductID, Quantity from [Order Details]", nwindConn);

DataSet custDS = new DataSet();

//打开连接

nwindConn.Open();

//带着架构信息填充数据集

custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;

ordDetDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;

ordDetDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;

custDA.Fill(custDS, "Customers");

orderDA.Fill(custDA, "Orders");

ordDetDA.Fill(custDS, "OrderDetails");

//关闭连接

nwindConn.Close();

//创建数据集关系

custDS.Relations.Add("CustomerOrders", custDS.Tables["Customers"].Columns["CustomerID"],

custDS.Tables["Orders"].Columns["CustomerID"]);

custDS.Relations.Add("OrderDetails", custDS.Tables["Orders"].Columns["OrderID"],

custDS.Tables["OrderDetails"].Columns["OrderID"]);

//为DataSet创建DataViewManager

DataViewManager myDVM = new DataViewManager(custDS);

foreach (DataViewSetting myDVS in myDVM.DataViewSettings)

{

myDVS.ApplyDefaultSort = true;

}

myDVM.DataViewSettings["Customers"].Sort = "CompanyName";

//绑定至DataGrid

System.Windows.Forms.DataGrid myGrid = new System.Windows.Forms.DataGrid();

myGrid.SetDataBinding(myDVM, "Custo

时间: 2024-10-21 10:12:11

C#数据库开发读书笔记4---DataView的使用的相关文章

C#数据库开发读书笔记1---数据库连接及DataReader的使用

1.ADO.NET结构: 两个核心组件:DataSet..NET数据提供程序(Connection.Command.DataReader和DataAdapter四个对象). DataSet是独立于任何数据源的数据访问,因此可用于多种不同的数据源,用于XML数据或独立于管理应用程序本地的数据:DataSet包含一个或多个DataTable对象的集合:DataSet和XML之间是相互兼容的. 2..NET数据提供程序: 2.1.Connection:提供与数据源的连接 2.2.Command:使用户

C#数据库开发读书笔记2---DataAdapter、DataSet的使用

6.DataAdapter的使用 .NET框架通过 DataAdapter 来控制与现有数据源的交互,每个 .NET 数据提供程序都包含一个 DataAdapter对象:OLE DB .NET 数据提供程序包含一个 OLEDBDataAdapter 对象, 而 SQL Server .NET 数据提供程序包含一个 SqlDataAdapter 对象. DataAdapter 对象用于从数据源中检索数据并填充 DataSet 中的表,并且还会将对 DataSet 作出的更改解析回数据源. Data

C#数据库开发读书笔记3---DataTable及表约束的应用

8.DataTable创建数据表 DataTable表示一个内存内关系数据的表,可以独立创建和使用,也可以由其他.NET框架对象使用, 最常见的情况是作为DataSet的成员使用. DataTable对象可通过使用DataTable构造函数来创建,或者可通过将构造函数参数传递到DataSet 的Tables属性的Add方法来创建. DataTable对象可通过使用DataAdapter对象的Fill方法或FillSchema方法在DataSet内创建,或者可使用 DataSet的ReadXml.

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflash或者nandflash:只好用另一块arm9(i.mx283a)来继续学习: 从开发教程上面可知,烧写uboot和Linux是通过各种批处理脚本和exe程序来执行的,称之为固件烧写,然而并没有需要我们选择uboot路径.Linux内核和文件系统的地方.这样的话是不是意味着只能烧写官方默认提供的文件

驱动开发读书笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇

驱动开发读书笔记. 0.04  linux 2.6 platform device register 平台设备注册  1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentation/driver-model/platform.txt Device Enumeration 82 ~~~~~~~~~~~~~~~~~~ 83 As a rule, platform specific (and often board-specific) setup code will 84 reg

驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识

驱动开发读书笔记. 0.06  嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB video class 或USB video device class.是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一. UVC linux driver: UVC linux 驱动 需要在编译内核的时候选上 配置内核 Device

驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇

驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇 下面这段摘自 linux源码里面的文档 : 内核版本2.6.22Documentation/driver-model/platform.txt找到一篇译文:http://blog.csdn.net/yili_xie/article/details/5193609 Device Enumeration 82 ~~~~~~~~~~~~~~~~~~ 83 As a rule

驱动开发读书笔记.0.00 从拿到一块开发板开始

当我们手上有一块arm开发板,我们应该怎么下手呢?(假设你有少许计算机和电子的基础) 1.01安装桌面版linux: 你可以装虚拟机 或者 双系统windows + linux [假装有链接] 1.如果你会重装系统,我建议你装双系统或直接ubuntu,end 2.如果你不会重装系统,跳到3 3.学会它,跳到1 1.02:开发板上装系统[链接以后再补] 烧boot 烧内核 烧文件系统 讲真,如果你看到这三个名词之后蒙圈了,请左拐去预习/复习操作系统 1.03 系统安装完成,开发板怎么和PC进行通信

《敏捷软件开发读书笔记之二》

接下来,我将向大家介绍第三部分“薪水支付案例研究”和第四部分“打包薪水支付系统”这两部分的认识,以及从中得到的收获: 以下是我从第三部分“薪水支付案例研究”中学到的相关知识以及个人的一些总结: Command模式的简单性掩盖了它的多功能性,此模式可以应用于多种能够不同的美妙用途,范围涉及数据库事物操作,设备控制,多线程核心以及GUI的Do/Undo管理,此模式是在实际的软件开发中是非常有用的. TEMPLATE METHOD模式和STRATEGY模式都可以用来分离高层的算法和低层的具体 实现细节