6.DataView对象

这里,我们首先引入数据绑定的概念,数据绑定是为了在控件上显示数据库表中存储的数据,而将应用程序的控件与数据表的行进行绑定的过程。
DataView对象表示用于排序、筛选、搜索、编辑和导航的DataTable的可绑定数据的自定义视图。DataView对象的作用主要体现四个方面,请参见图434所示:
4-2 ADO.NET-查询和检索数据3_第1张图片
4-34 DataView对象的作用体现图
DataView对象常用的方法和属性请参见表419和表420所示:
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类的构造函数有三个重载,请参见表421所示:
4-21 DataView类的构造函数重载表
名称
说明
DataView()
初始化DataView类的新实例。
DataView(DataTable
用指定的DataTable初始化DataView类的新实例。
DataView(DataTable, String, String, DataViewRowState
用指定的DataTableRowFilterSortDataViewRowState初始化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 对象来实现这个功能。请参见图435所示:
4-2 ADO.NET-查询和检索数据3_第2张图片
4-35 DataAdapter 对象的作用体现图
从图452中可以看出 DataAdapter 对象起到一个在数据库和 DataSet 数据集之间运输数据的作用。可以用生活案例进行类比,参见图436所示:
4-2 ADO.NET-查询和检索数据3_第3张图片
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 对象的工作原理请参见图437所示:
4-2 ADO.NET-查询和检索数据3_第4张图片
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 对象常用的方法和属性请参见表423和表424所示:
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 ,其基本工作原理过程前面章节多次提到,这里不再过多叙述,请参见图438所示:
4-2 ADO.NET-查询和检索数据3_第5张图片
4-38 使用DataAdapter对象填充数据集操作图
使用 DataAdapter 对象填充数据集分两步:
n 第一步:使用Connection连接数据源;
n 第二步:使用Fill()方法填充DataSet中的表。
填充数据集语法参见图439所示:
4-2 ADO.NET-查询和检索数据3_第6张图片
4-39 使用DataAdapter对象填充数据集语法图
3)如何保存DataSet中的数据
    把数据集中修改过的数据再提交给数据源,这个工作原理过程前面章节多次提到,这里不再过多叙述,请参见图440所示:
4-2 ADO.NET-查询和检索数据3_第7张图片
4-40 把数据集中修改过的数据提交到数据源操作图
保存DataSet中数据变化的数据语法参见图441所示:
4-2 ADO.NET-查询和检索数据3_第8张图片
4-41 使用DataAdapter对象保存DataSet中的数据语法图
这里只是应用最简单的Update()一个表,通过SqlCommandBuilder对象来自动生成更新需要的相关命令,不用手动一个一个的写,简化操作。