VS 2005中的Dataset

数据源
Visual Studio 2005 引入了项目数据源的概念。数据源代表在应用程序中可以使用的数据。数据库不是这些数据的唯一来源,定义数据源所使用的 Data Source Configuration Wizard 允许您从三种不同的源获取数据: 

1.
 数据库 — 既可以是基于服务器的数据库(例如 SQL Server 或 Oracle),也可以是基于文件的数据库(例如 Access 或 SQL Server Express)。Visual Studio 自动生成类型化 DataSet 及其他类,并将它们添加到项目。 
 
2.
 对象 — 任何具有公共属性的对象都可以是数据源。不一定非要实现某个特殊接口。 
 
3.
 Web 服务 — 从 Web 服务创建的数据源,将创建与 Web 服务返回的数据类型相对应的对象。 
 

数据源具有事半功倍的作用。一方面,它可以使指定、设计和生成代表应用程序数据的强类型类更容易。另一方面,它提供一种灵活而统一的机制,可非常快速地构建功能丰富、运行高效的 WinForm 和 WebForms 用户界面。在阅读本文的过程中,您将了解到这是多么得快速、简单和灵活。

数据库 (DataSet) 数据源的创建及其在 WinForms 应用程序中的使用是本文的重点内容。但是,以下两点也不容忽视: 

• 一旦创建了数据源,就将以相同的方式使用每个数据源,而无需考虑其数据来自何处。也就是说,就像您可以轻松地将基于 Database 的数据源(以图形方式)绑定到网格控件或一组控件上一样,真正来自 Web 服务或您自定义业务对象的数据也要绑定到控件上。 
 
• 无论是在 WinForms 还是在 WebForms 应用程序中使用,数据源均以同一种方式进行定义。不同的数据提供程序也进行了抽象,以便在只使用 DataSets 和 TableAdapters 公开数据访问的情况下,只需更改连接字符串并重新生成类就可以更改实际使用的数据库。 

类型化 DataSet 和 TableAdapter

数据库数据源就是一个强类型 DataSet 与一个或多个强类型 DataTables 和 TableAdapters 对的组合。类型化 DataSet 的概念并不陌生,在 Visual Studio 2002/2003 中就已经提出。虽然它是从 .NET Framework 的一般 DataSet 类派生的生成类,但它具有定义好的架构以及特定于该架构的属性和方法。与此同时,DataSet 中的每个表还要生成其他三个特定于该 DataSet 的派生类 — DataTable、DataRow 和 DataRowChangeEvent 类。在这些类中,每个类都有针对相关表的特定架构、属性和方法。例如,如果根据 Northwind Employees 表定义一个数据源,最终将生成以下类: 

• NorthwindDataSet 
 
• EmployeesDataTable 
 
• EmployeesDataRow 
 
• EmployeesRowChangeEvent 
 

这四个类就组成了一个类型化 DataSet。在 Visual Studio 2005 中还将生成第五个类,名为 EmployeesTableAdapter 的类型化 TableAdapter,稍后我们将讨论这个类。当然,如果您以动态方式定义查询,那么就不能生成类型化 DataSet,而是需要使用标准的 DataSet。

为什么要为类型化DataSet 而烦恼呢?因为除了促使您预先考虑数据的架构,而非仓促决定之外,类型化 DataSet 还提供了一些实际的优点: 

1.
 DataSets、DataTables、DataRows 和 RowChangeEvent 都特定于正在处理的架构。 
 
2.
 表、列和关系是以命名的属性方式公开的,而非一般的集合元素。 
 
3.
 由于 (2) 的原因,Visual Studio 代码编辑器将支持完整的智能感知和语句结束支持。 
 
4.
 可以实现编译时类型检查,例如在编译时而不是等到运行时就可以捕捉到字段名拼写错误,这同样是由于 (2) 的原因。 
 
5.
 代码更简洁,可读性更强。例如以下代码行: 

country = dsNorthwind.Tables ("Employees").Rows (row) ("Country") 

可以替换为 

country = dsNorthwind.Employees (row).Country 

 

总而言之,类型化 DataSets 所提供的设计时和编译时支持不但可以大大地减少启动开发时间,而且可以减少调试和稳定应用程序所需的时间。

此外,TableAdapter 是 Visual Studio 2005 新提出的概念。它意味着强类型 TableAdapter 就是标准 DataAdapter 的强类型等价类。您可以使用 TableAdapter 连接到数据库,执行对数据库的查询或存储过程,并将数据填写到相关的 DataTable。每个 DataTable-TableAdapter 对都以一个 TableAdapter 指代。

TableAdapter 实质上就是一个标准的 DataAdapter 的外部包装程序,它提供以下一些好处: 

• 同一个 TableAdapter 类可在多个窗体或组件上使用,因此任何对查询/命令进行的更改都将自动在所有实例中反映出来。这不同于现有情形,在现有情形下,每个访问数据库的组件都必须拥有各自单独配置的 DataAdapter。但是如果要确保 DataTables 和 DataAdapters 保持同步,这样做将更容易。 
 
• 如果要为某个指定的 DataTable 定义多个查询/命令,使用一个 TableAdapter 即可轻松完成,而不必使用多个 DataAdapters 或手动切换代码。 
 
• Fill 命令的名字可读性强、较友好,而且 TableAdapter 包含的代码可以自动为这些命令方法中的所有参数填加类型和值信息。您再也不需要将其以特定于提供程序的数据类型(例如 SqlInt)进行传递了。 
 

举一个简单的代码片断示例会有助于解释这些特性。在 Visual Studio 2002/2003 中,即使使用了类型化 DataSet,执行一个带有两个参数的简单查询也需要不少的代码。对于下列查询 

SELECT FirstName, LastName from Employees WHERE Country = @country AND City = @city

我们必须按以下方式编写代码:

Me.SqlAdapter1.SelectCommand.Parameters ("@country").value =     
Me.CountryListbox.SelectedValue.Trim()   
Me.SqlAdapter1.SelectCommand.Parameters ("@city").value =     
Me.CityTextbox.Text.Trim()   
Me.SqlAdapter1.Fill (Me.NorthwindDataSet.Employees)

毫无疑问,随着参数数量的增长,代码行数也将不断增加。但更重要的是,正确地记忆和输入所有参数名的机率却大大降低了。即使准确记住了参数名,也仍然需要记住参数的数据类型。这还不是最糟糕的情况,如果错误地输入了字段名或者为值赋了错误的类型,那么很可能到运行时才会察觉。

如果使用 Visual Studio 2005 中的 TableAdapter,一旦定义了命令 FillByCountryAndCity,在任何地方使用它时只需编写一行代码,将其以参数值形式传递即可:

Me.EmployeesTableAdapter.FillByCountryAndCity ( _
   Me.NorthwindDataSet.Employees, Me.CountryListbox.SelectedValue.Trim(), 
      _    Me.CityTextbox.Text.Trim() )

不容忽视的是,我们不仅可以从一个 TableAdapter 那里取得多个命名命令,而且这些命令都是强类型的。这就意味着在 Visual Studio 中编写代码时,可以将这些命令视为 TableAdapter 的方法,因为我们获得了完整的智能感知。我们还要对这些命令的参数进行编译时类型检查,同时,方法和参数类型定义的工具提示也可以助我们一臂之力。TableAdapter 可以包含多个执行不同命令、接收不同参数的方法。

添加一个数据源:

数据(A)-->添加数据源

TableAdapter Configuration Wizard

选择 Data 主菜单中的 Add Query 或 Configure(一个现有查询),或者在设计器中右键单击 TableAdapter,从得到的上下文菜单中选择这两项,可以启动 DataSet 设计器中的 TableAdapter Configuration Wizard。此向导等同于 Visual Studio 2002/2003 的 DataAdapter Configuration Wizard,只不过多了两个附加页面。一个是图 3 所示的 Choose a Query Type 页面。由于 TableAdapter 汇集了针对给定表的所有命令,因此该页面允许您定义多个 Select/Fill 命令和查询 — 任何类型的查询都可以,例如 Update、Insert、Delete 或返回单个值类型的查询。切记,这些更新查询是 TableAdapter 的命名方法,必须直接调用。而且它们还是执行 TableAdapter 的 Update 方法时自动调用的更新查询,这与执行 DataAdapter.Update 方法一样。

向导中另一个增加的页面是 Choose Methods to Generate 页。在该页中可以选择您所定义的每个查询/命令方法名(一个或多个)。向导为每个命令都提供一个 Fill 和 Get 方法,如图 3 所示。Fill 要求提供需要填写数据的 DataTable,而 Get 方法将返回填写后新创建的 DataTable。

按照典型的用法,您可以为一个 TableAdapter 定义多个 Fill 命令,它将返回同一种架构(多个列),只是 WHERE 子句不同而已。这也是默认情况下向导会为方法名提供一个 FillBy 和 GetDataBy 前缀的原因。不过,您当然可以选择任何名字作为方法名。

虽然 TableAdapter 可以包含多个 Fill 命令,但在调用其中的 Update 方法时却只能执行一组更新命令。这组命令根据 TableAdapter 的主查询自动生成。第一次创建 TableAdapter 时定义的查询被认为是它的主查询。如果随后定义的任何查询返回的架构与主查询的架构不同,则设计器将显示一个消息框进行提醒。另一方面,如果您修改了主查询的架构,Visual Studio 将修改其他查询的架构以与之匹配。

可以通过自定义SQL来更改

输入下列 SQL 语句。 

SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, 
ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, 
ShipRegion, ShipPostalCode, ShipCountry 
FROM Orders
WHERE CustomerID = @CustID

此后,返回由进行查询的 @CustID 参数指定的所有客户 Orders。

对于数据绑定至关重要的类是 BindingSource 类,在当前示例中,它被命名为含义清晰的 OrdersBindingSource。BindingSource(在 Beta 1 版本中称为 DataConnector)提供将控件绑定到窗体所需的服务。它在数据源和绑定到其上的控件之间提供了一个中间层。通过设置 BindingSource 的 DataSource 和 DataMember 属性,可将它连接到数据源,然后将控件添加到控件的 DataBindings 集合中,从而将控件绑定到 BindingSource。所有与数据的交互(例如,记录导航、排序、筛选和编辑)均通过 BindingSource 完成。此外,还允许通过 List、Item 和 Current 属性访问底层数据。

添加的另外一个组件是 OrdersBindingNavigator。BindingNavigator 类是提供标准用户界面的工具栏,用于导航和操作窗体上的数据。BindingNavigator(Beta 1 版本中称为 DataNavigator)是一个具有一组预配置按钮的 ToolStrip 控件。它可以连接到 BindingSource,将其作为自身的数据源,并且可以提供控制导航可用数据的工具栏按钮。如果您希望响应一些导航事件(而不是控制导航),那么应该挂钩 BindingSource 对象的事件

关于BindingSource 的挂钩的事件  如

导航中的保存按钮

private void ordersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.ordersBindingSource.EndEdit();   //将挂起的更改应用于基础数据源
            this.ordersTableAdapter.Update(this.northwindDataSet.Orders);

        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值