演练:Windows 窗体中的简单数据访问,已做!

来源:互联网 发布:解压密码破解软件 编辑:程序博客网 时间:2024/03/28 17:32

若要完成本演练,您需要:

  • 访问带有 Pubs SQL Server 示例数据库的服务器。

演练被分成若干较小的部分:

  • 创建 Windows 窗体。
  • 创建并配置将要针对其绑定窗体的数据集。这包括创建一个通过数据库填充数据集的查询。
  • 向窗体添加 DataGrid 控件,并将其绑定到数据。
  • 添加代码来填充数据集。
  • 添加将数据集更改发送回数据库的代码。

创建项目和窗体

第一步是创建 Windows 窗体。

创建项目和窗体

  1. 如果已经有打开的解决方案,请从“文件”菜单中选择“关闭解决方案”。
    注意   在成品项目中,经常会在同一个解决方案中含有多个项目。但是在本演练中,您将关闭任何已打开的解决方案,并与项目一起创建一个新的解决方案,使在此执行的操作与任何现有窗体、数据集等之间不存在任何冲突。
  2. 从“文件”菜单中,指向“新建”,然后单击“项目”。
  3. 在“项目类型”窗格中,选择“Visual Basic 项目”、“Visual C# 项目”或“Visual C++ 项目”。
  4. 在“模板”窗格中,选择“Windows 应用程序”(如果是 Visual Basic 和 Visual C# 项目),或者选择“Windows 窗体应用程序 (.NET)”(如果是 Visual C++ 项目)。
  5. 赋予项目符合所使用的命名规则的唯一名称。例如,可以将此项目命名为 Walkthrough_Simple1
  6. 当分配名称并指定新的解决方案后,请单击“确定”。

    Visual Studio 创建一个新项目,并在 Windows 窗体设计器中显示新窗体。

创建和配置数据集

与 Windows 窗体应用程序中的大多数数据访问方案一样,您将要用到数据集。数据集是一个保存您想要使用的记录的容器(缓存)。

注意   使用数据集只是访问数据的一种方法,它在有些情况下并不是最佳的选择。然而在 Windows 窗体应用程序中,数据集通常是正确的选择,在本演练中就将使用一个数据集。有关更多信息,请参见数据访问策略建议

在本演练中,您将向窗体添加数据集。不过,并不因为该数据集尚不存在,您就手动向窗体添加该数据集。您应执行的是如下步骤:

  • 使用向导创建数据适配器。该适配器包含用于读取和写入数据库信息的 SQL 语句。该向导帮助您定义所需的 SQL 语句。如有必要,该向导还创建与数据库的连接。
  • 生成数据集架构。在此过程中,您将让 Visual Studio 基于您正在访问的表和列创建一个新的类型化数据集类。在生成数据集类时,您还将向窗体中添加该类的一个实例。

遵循本节中的所有过程很重要。否则,窗体将不具有在本演练随后部分要使用的数据集。

有关数据适配器的更多信息,请参见数据适配器介绍。有关数据集的更多信息,请参见数据集介绍

配置数据连接和数据适配器

首先,请创建一个数据适配器,其中包含以后用于填充数据集的 SQL 语句。作为此过程的一部分,定义连接以访问数据库。使用向导配置数据适配器,该向导使创建数据访问所需的 SQL 语句变得容易。

注意   向导完成后,您必须继续下一部分操作,以便生成数据集并完成窗体的数据访问部分。
安全说明   存储连接字符串的详细信息(例如服务器名称、用户名称和密码)可能会影响应用程序的安全性。若要控制对数据库的访问,一种较为安全的方法是使用 Windows 集成安全性。有关更多信息,请参见数据库安全性

创建数据连接和数据适配器

  1. 从“工具箱”的“数据”选项卡中,将 OleDbDataAdapter 对象拖到窗体上。
    注意   您还可以使用 SqlDataAdapter,它为用于 SQL Server 7.0 或更高版本进行了优化。在本演练中使用 OleDbDataAdapter,因为它更通用,可以提供对任何与 OLE DB 兼容的数据源的 ADO.NET 访问。

    “数据适配器配置向导”启动,它将帮助您创建连接和适配器。

  2. 在该向导中,执行下列操作:
    1. 在第二个窗格中,创建或选择一个指向 SQL Server Pubs 数据库的连接。
    2. 在第三个窗格中,指定您要使用 SQL 语句来访问数据库。
    3. 在第四个窗格中创建以下 SQL 语句:
      SELECT au_id, au_lname, au_fname, city, state, phone, contractFROM authors

      为了便于生成 SQL 语句,请单击“查询生成器”以启动“查询生成器”。

      注意   在本演练中,将用 authors 表中的所有行填充该数据集。在成品应用程序中,通常通过创建只返回所需列和行的查询来优化数据访问。有关示例,请参见演练:使用参数化查询在 Windows 窗体中显示数据
  3. 单击“完成”完成该向导。

    向导完成后,您将获得一个连接(在 Visual Basic 中为 OleDbConnection1,在 Visual C# 或 Visual C++ 中为 oleDbConnection1),该连接包含与如何访问数据库有关的信息。您还将拥有一个数据适配器(在 Visual Basic 中为 OleDbDataAdapter1,在 Visual C# 或 Visual C++ 中为 oleDbDataAdapter1),其中包含一个用于定义要访问数据库中哪个表和哪些列的查询。 先连接再有适配器

向导完成后,基于在该过程中创建的 SQL 查询生成数据集。有关更多信息,请参见下一节。

创建数据集

建立连接到数据库的方法并指定所需的信息(通过数据适配器中的 SQL 命令)后,可以让 Visual Studio 创建数据集。Visual Studio 可以基于您为数据适配器指定的查询自动生成数据集。数据集是基于相应 XML 架构(.xsd 文件)的 DataSet 类的实例,该架构描述类的元素(表、列和约束)。有关数据集与架构之间关系的更多信息,请参见 ADO.NET 数据访问介绍

生成数据集

  1. 从“数据”菜单中选择“生成数据集”。
    提示   如果看不到“数据”菜单,请在窗体中单击;窗体必须具有焦点,该菜单才会出现。

    显示“生成数据集”对话框。

  2. 选择“新建”选项,将数据集命名为 dsAuthors

    在“选择要添加到数据集中的表”下面的列表中,应选择“authors”表。

  3. 确保“将此数据集添加到设计器”已选中,然后单击“确定”。

    Visual Studio 生成某类型化数据集类 (dsAuthors) 和定义该数据集的架构。您将在“解决方案资源管理器”中看到新架构 (dsAuthors.xsd)。

    提示   在“解决方案资源管理器”中,单击“显示所有文件”可查看架构文件的相关 .vb 或 .cs 文件,该文件包含定义新数据集类的代码。

    最后,Visual Studio 将新数据集类的一个实例(DsAuthors1dsAuthors1)添加到窗体中。

此时,已完成为从数据库中获取信息并将信息转移到数据集所需的全部设置。准备创建一个显示数据的窗体。

添加显示数据的 DataGrid 控件

在本演练中,您将添加一个控件(即 DataGrid 控件),它可以同时显示数据集内的所有记录。另一个方法是使用文本框等单个控件一次显示一个记录。该策略随后会要求您向窗体添加导航功能。因此,为了简便起见,应将使用数据网格。

注意   有关如何使用单个文本框显示数据集的记录的示例,请参见演练:使用参数化查询在 Windows 窗体中显示数据

数据网格必须绑定到数据集才能显示数据。

向窗体添加绑定 DataGrid 控件

  1. 如果尚未这样做,请单击当前窗口顶部的选项卡以切换到窗体设计器。
  2. 从“工具箱”的“Windows 窗体”选项卡中,将 DataGrid 控件拖到窗体上。
  3. F4 键以显示“属性”窗口。
  4. DataSource 属性中,选择 DsAuthors1(或 dsAuthors1)作为数据源。不选择 DsAuthors1.Authors(或 dsAuthors1.Authors)。
  5. DataMember 属性中选择“authors”。

    设置这两个属性会将 DsAuthors1 数据集内的 authors 数据表绑定到网格。

  6. 调整网格的大小,以便可以看到所有列。更改其高度,以便能够看到多个作者记录。

填充 DataGrid 控件

尽管数据网格被绑定到所创建的数据集,但是,数据集本身不会被自动填写。相反,您必须自己调用数据适配器方法来填充数据集。有关填充数据集的更多信息,请参见数据集介绍

填充 DataGrid 控件

  1. 从“工具箱”的“Windows 窗体”选项卡中,将 Button 控件拖到窗体上。
  2. 将该按钮命名为 btnLoad,通过设置其 Text 属性将标题更改为“加载”。
  3. 双击该按钮以创建其 Click 事件的事件处理方法。
  4. 在该方法中,清除所创建的数据集,然后调用数据适配器的 Fill 方法,向该方法传递要填充的数据集。

    下面的示例显示完整的方法:

    ' Visual BasicPrivate Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click   DsAuthors1.Clear()   OleDbDataAdapter1.Fill(DsAuthors1)End Sub// C#private void btnLoad_Click(object sender, System.EventArgs e){   dsAuthors1.Clear();   oleDbDataAdapter1.Fill(dsAuthors1);}// C++private:   System::Void btnLoad_Click(System::Object *  sender,      System::EventArgs *  e)      {         dsAuthors1->Clear();         oleDbDataAdapter1->Fill(dsAuthors1);      }

更新数据库

当用户在网格进行更改后,控件自动在数据集内保存更新的记录。在 Windows 窗体中,数据绑定结构将数据绑定控件的值写入这些控件所绑定到的数据行。

注意   在 Web 窗体页中,数据绑定的工作方式略有不同。有关 Web 窗体页中数据绑定的逐步骤示例,请参见演练:在 Web 窗体页中显示数据演练:在 Web 窗体中使用数据库更新查询更新数据

但是,当使用数据集时,更新需要两个步骤。当数据在数据集内后,您仍必须将其从数据集发送到数据库。数据适配器可通过其 Update 方法完成此操作,该方法检查数据集内所指定数据表中的每个记录,如果某记录已更改,则向数据库发送相应的“更新”(Update)、“插入”(Insert) 或“删除”(Delete) 命令。有关更多信息,请参见数据集更新介绍

在本演练中,将向窗体添加一个按钮,当用户想将其更新发送到数据库时,可以按该按钮。

更新数据库

  1. 从“工具箱”的“Windows 窗体”选项卡中,将 Button 控件拖到窗体上。
  2. 将该按钮命名为 btnUpdate,通过设置其 Text 属性将标题更改为“保存对数据库的更改”。
  3. 双击该按钮以创建其 Click 事件的事件处理方法。
  4. 在该方法中调用数据适配器的 Update 方法,向该方法传递数据集,该数据集包含要发送到数据库中的更新。使用“消息框”(MessageBox) 对象显示确认文本。

    下面的示例显示完整的方法:

    ' Visual BasicPrivate Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click   OleDbDataAdapter1.Update(DsAuthors1)   MessageBox.Show("Database updated!")End Sub// C#private void btnUpdate_Click(object sender, System.EventArgs e){   oleDbDataAdapter1.Update(dsAuthors1);   MessageBox.Show("Database updated!");}// C++private:   System::Void btnUpdate_Click(System::Object *  sender,      System::EventArgs *  e)      {         oleDbDataAdapter1->Update(dsAuthors1);         MessageBox::Show("Database updated!");      }

测试

现在可以测试该窗体,以确保它在网格中显示作者数据,并且用户可以进行更新。

测试窗体

  1. F5 键运行该窗体。
    注意   此时,通常会获得类型为 System.Data.SqlClient.SqlException 的异常,这很可能是由您的数据库登录凭据的保存方式导致的。有关纠正该问题的信息,请参见在运行时不能访问可在设计时访问的数据库
  2. 在窗体显示后,单击“加载”按钮。

    在网格中显示一个作者列表。

  3. 对网格中的一个记录进行更改。

    在移动到网格中的另一个记录时,所做更改将保留。请在心中记住所做更改。

  4. 再次单击“加载”按钮。

    这将从数据库重新加载该数据集并刷新网格。注意,因为未将所做更改从数据集保存到数据库,所以您在第 3 步中所做的更改未被保留。

  5. 再次对网格中的一个记录进行更改。
  6. 单击“保存对数据库的更改”按钮。

    将看到显示消息框,但网格中没有任何更改。

  7. 再次单击“加载”按钮从数据库重新加载数据。

    这次,因为相应数据已保存到数据库中,所以您在第 5 步中所做的更改被保留。