6.DataView对象
这里,我们首先引入数据绑定的概念,数据绑定是为了在控件上显示数据库表中存储的数据,而将应用程序的控件与数据表的行进行绑定的过程。
DataView对象表示用于排序、筛选、搜索、编辑和导航的DataTable的可绑定数据的自定义视图。DataView对象的作用主要体现四个方面,请参见图4-34所示:
图4-34 DataView对象的作用体现图
DataView对象常用的方法和属性请参见表4-19和表4-20所示:
表4-19 DataView对象常用属性表
属性
|
说明
|
Item
|
用于从指定的表中获取一行数据
|
RowFilter
|
用于获取或设置表达式,该表达式用于筛选可以在DataView中查看的行
|
RowStateFilter
|
用于获取DataView的行状态筛选器
|
Table
|
用于表示源DataTable
|
表4-20 DataView对象常用方法表
方法
|
说明
|
AddNew()
|
向DataView添加新行
|
Delete()
|
用于删除指定索引处的行
|
请看下面的使用示例代码:
DataView objStudentView = new DataView(objStudentTable);
objStudentView.RowFilter = "StudentMarks > 60";
for (int ctr = 0; ctr < objStudentView.Count; ctr++)
{
MessageBox.Show(objStudentView[ctr]["StudentNo"].ToString());
}
在上面的代码中,创建了DataView对象并对该视图应用某种筛选器。得到的DataView对象可能是objStudentTable表的一个子集,范围是"StudentMarks"字段值大于60的所有学生信息记录。后续代码可以对这个DataView对象里的数据进行访问或者数据绑定。
DataView对象的创建是通过构造函数实例化的。DataView类的构造函数有三个重载,请参见表4-21所示:
表4-21 DataView类的构造函数重载表
名称
|
说明
|
初始化DataView类的新实例。
|
|
用指定的DataTable初始化DataView类的新实例。
|
|
用指定的DataTable、RowFilter、Sort和DataViewRowState初始化DataView类的新实例。
|
请看下面的使用示例代码:
private void MakeDataView()
{
DataView view = new DataView();
view.Table = DataSet1.Tables["Suppliers"];
view.AllowDelete = true;
view.AllowEdit = true;
view.AllowNew = true;
view.RowFilter = "City = 'Berlin'";
view.RowStateFilter = DataViewRowState.ModifiedCurrent;
view.Sort = "CompanyName DESC";
//简单绑定到一个TextBox控件上
Text1.DataBindings.Add("Text", view, "CompanyName");
}
代码中用的是第一种构造函数实例化一个DataView对象,实例化后仍然需要为DataView对象指定数据表和RowFilter、Sort和RowStateFilter等属性。但如果用第三种构造函数实例化,在后续代码中就不需要设置上述属性。
DataView的一个主要功能是允许在Windows窗体和Web窗体上进行数据绑定。
另外,可自定义DataView来表示DataTable中数据的子集。此功能让您拥有绑定到同一DataTable、但显示不同数据版本的两个控件。例如,一个控件可能绑定到显示表中所有行的DataView,而另一个控件可能配置为只显示已从DataTable删除的行。DataTable也具有DefaultView属性。它返回表的默认DataView。例如,如果希望在表上创建自定义视图,请在DefaultView返回的DataView上设置RowFilter。
若要创建数据的筛选和排序视图,请设置RowFilter和Sort属性。然后,使用Item属性返回单个DataRowView。你还可使用AddNew()和Delete()方法从行的集合中进行添加和删除,而在使用这些方法时,可设置RowStateFilter属性以便指定只有已被删除的行或新行才可由DataView显示。
4-2-3 DataAdapter对象
前面的章节提到客户端应用程序去访问DataSet对象中的数据。那么,如何将数据库的数据放在DataSet中?这里就需要利用DataAdapter对象来实现这个功能。请参见图4-35所示:
图4-35 DataAdapter对象的作用体现图
从图4-52中可以看出DataAdapter对象起到一个在数据库和DataSet数据集之间运输数据的作用。可以用生活案例进行类比,参见图4-36所示:
图4-36 DataAdapter对象的生活案例类比图
类比关系如下:
n仓库—— 数据库
n临时仓库—— 数据集
n仓库与临时仓库之间的路 —— 数据库连接
n运货车 —— 数据适配器
从类比关系中可以看出,DataAdapter数据适配器就像大货车一样,可以将数据从数据库这个大仓库运输到DataSet数据集这个临时仓库。也可以把数据从数据库这个DataSet数据集这个临时仓库运输到大仓库。不过有一点要说明:生活中的仓库里面的货物被运走了,就没有了。但数据库里的数据被传输到客户端时,数据不会消失。这是信息世界与物质世界的不同。
1.DataAdapter对象概述
DataAdapter数据适配器用于在数据源和数据集之间交换数据。在许多应用程序中,这意味着从数据库将数据读入数据集,然后从数据集将已更改数据写回数据库。通常DataAdapter数据适配器是可以配置的,允许指定哪些数据移入或移出数据集。这经常采用的形式是对SQL语句或存储过程的引用,这些语句或存储过程被调用时即可实现对数据库进行读写。
每个数据适配器DataAdapter都将在单个数据源表和数据集内的单个DataTable对象之间交换数据。如果数据集包含多个数据表,通常的策略是令多个数据适配器向数据集提供数据,并将其数据写回各个数据源表。
DataAdapter对象表示一组数据命令和一个数据库连接,用于填充DataSet对象和更新数据源。作为DataSet对象和数据源之间的桥接器,通过映射Fill()方法向DataSet填充数据,通过Update()方法向数据库更新DataSet对象中的变化。这些操作实际上是由DataAdapter对象包含的Select、Update、Insert、Delete四种Command命名对象实现的。也可以直接结合Command对象的使用来完成数据的操作。DataAdapter对象的工作原理请参见图4-37所示:
图4-37 DataAdapter对象的工作原理图
在客户端应用程序需要处理数据源的数据时,客户端应用程序与数据源之间建立连接。引用数据命令的DataAdapter对象向数据源发送数据命令请求,这个请求是执行DataAdapter对象的Fill()方法来完成“填充”操作时发送并被数据源执行的。数据源的数据就会填充到客户端的DataSet对象,在DataSet对象内部形成具有跟数据源数据结构一致的数据表DataTable对象,而DataTable对象内部有包含表示数据结构的DataColumn对象集合和表示数据约束的Constraint对象集合,还含有表示数据记录的DataRow对象的集合。数据以及数据结构填充到DataSet对象后,DataSet数据集相当于一个脱机数据库,客户端应用程序操作的数据完全从DataSet数据集中获取。这是客户端DataSet数据集与数据源之间可以断开连接,也就是说它们之间的关系是非永久连接关系。只有客户端完成数据操作需要将数据回传给数据源时,再次建立连接。由DataAdapter对象再次向数据源发送数据命令请求,这个请求是执行DataAdapter对象的Update()方法来完成“更新”操作时发送并被数据源执行的。执行后,连接再次断开。.NET提供程序及其DataAdapter类,请参见表4-22所示:
表4-22 各个命名空间中的DataAdapter对象表
提供程序
|
DataAdapter类
|
SQL数据提供程序
|
SqlDataAdapter
|
OLE DB数据提供程序
|
OleDbDataAdapter
|
Oracle数据提供程序
|
OracleDataAdapter
|
ODBC数据提供程序
|
OdbcDataAdapter
|
在后面的内容中,主要以SqlDataAdapter对象为例。
2.DataAdapter对象使用
(1)DataAdapter对象的属性和方法
DataAdapter对象常用的方法和属性请参见表4-23和表4-24所示:
表4-23 DataAdapter对象常用属性表
属性
|
说明
|
AcceptChangesDuringFill
|
决定在把行复制到DataTable中时对行所做的修改是否可以接受
|
TableMappings
|
容纳一个集合,该集合提供返回行和数据集之间的主映射
|
表4-24 DataAdapter对象常用方法表
方法
|
说明
|
Fill()
|
用于添加或刷新数据集,以便使数据集与数据源匹配
|
FillSchema()
|
用于在数据集中添加DataTable,以便与数据源的结构匹配
|
Update()
|
将DataSet里面的数值存储到数据库服务器上
|
请看下面的使用示例代码:
static private DataSet CreateCommandAndUpdate(string connectionString,string queryString)
{
DataSet dataSet = new DataSet();
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = new OleDbCommand(queryString, connection);
OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter);
dataAdapter.Fill(dataSet);
//这里填写修改数据集dataSet的代码
//如果没有使用OleDbCommandBuilder,这行会报错
dataAdapter.Update(dataSet);
}
return dataSet;
}
代码示例中,首先利用dataAdapter.Fill()将数据从数据源填充到数据集dataSet;最后又利用dataAdapter.Update()将数据集dataSet中的数据回传至数据源。
(2)如何填充数据集
在前面的章节中,我们已经知道,可以通过DataAdapter对象填充数据集对象Dataset,其基本工作原理过程前面章节多次提到,这里不再过多叙述,请参见图4-38所示:
图4-38 使用DataAdapter对象填充数据集操作图
使用DataAdapter对象填充数据集分两步:
n 第一步:使用Connection连接数据源;
n 第二步:使用Fill()方法填充DataSet中的表。
填充数据集语法参见图4-39所示:
图4-39 使用DataAdapter对象填充数据集语法图
(3)如何保存DataSet中的数据
把数据集中修改过的数据再提交给数据源,这个工作原理过程前面章节多次提到,这里不再过多叙述,请参见图4-40所示:
图4-40 把数据集中修改过的数据提交到数据源操作图
保存DataSet中数据变化的数据语法参见图4-41所示:
图4-41 使用DataAdapter对象保存DataSet中的数据语法图
这里只是应用最简单的Update()一个表,通过SqlCommandBuilder对象来自动生成更新需要的相关命令,不用手动一个一个的写,简化操作。
本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/216019,如需转载请自行联系原作者