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()
|
初始化DataView类的新实例。
|
DataView(DataTable)
|
用指定的DataTable初始化DataView类的新实例。
|
DataView(DataTable, String, String, DataViewRowState
)
|
用指定的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对象来自动生成更新需要的相关命令,不用手动一个一个的写,简化操作。