跟大家一起学习,一起进步 2005 坚强 努力 整洁

导航

在Visual Basic .NET中使用存储过程(2)

使用存储过程更新数据库

  以上示例使用存储过程从数据库中提取信息。在复杂应用程序中使用存储过程更新、插入和删除记录也很常见。让我们看看如何使用 ADO.NET 完成该操作。

  在第一个示例中,我们将使用 Visual Studio? .NET 中的向导编写一个存储过程集合,并创建使用这些过程的代码。尽管我们只需在此示例中编写最少量的代码,但检查向导创建的代码有助于我们理解除获取数据以外,有关与存储过程交互操作的过程。

  在此示例中,我们将使用 Northwind 示例数据库中的 Customers 表。安装后的 Northwind 数据库中不包含用于更新、插入或删除客户的存储过程,但 Visual Studio .NET 中的 DataAdapter Configuration Wizard(数据适配器配置向导)可轻松地为我们编写一些存储过程。

  启动新的 Windows Application(Windows 应用程序)项目。在空白的 Form1 上,放置一个 DataGrid 和两个按钮。和先前一样,更改 DataGridAnchor 属性使之锚定到全部四个边。将按钮命名为 btnFillbtnUpdate,并分别将其 Text 属性更改为 FillUpdate

  转到 Toolbox(工具箱)的 Data(数据)选项卡,将 SqlDataAdapter 控件拖动到窗体上,然后释放鼠标。这将启动 DataAdapter Configuration Wizard(数据适配器配置向导)。单击 Next(下一步)按钮开始向向导中输入信息。

  首先,需要选择一个到 Northwind 数据库的连接;如果列表中未显示所需连接,则单击 New Connection(新建连接)按钮创建一个连接。然后单击 Next(下一步)按钮。

  下一屏幕上将出现三种数据访问方法。其外观与图 2 类似。

图 2:选择用于 DataAdapter 的数据访问类型

  此时,多数演示软件示例选择第一个选项来使用 SQL 语句。但是,我们将使用第二个选项,并让向导为我们生成一些存储过程。选择 Create new stored procedures(创建新存储过程)选项,然后单击 Next(下一步)按钮。

  下一屏幕将请求 SQL 语句,指示最初从数据库中提取的数据。但并不直接使用此 SQL 语句。SQL 语句中的信息将用于构造存储过程,以便执行实际数据访问。为使示例简单起见,请输入 SQL 语句 SELECT * FROM Customers,然后按 Next(下一步)按钮。

  此时,向导会请求要创建的存储过程的名称。操作共有四种 - Select、Update、Insert 和 Delete 操作。按以下方法对其命名:

  • Select:MSDNSelectCustomers
  • Update:MSDNUpdateCustomer
  • Insert:MSDNInsertCustomer
  • Delete:MSDNDeleteCustomer

  选择 Yes, create them in the database for me(是的,在数据库中创建它们。)选项。此时,向导屏幕应该如图 3 所示。

图 3:命名要由 DataAdapter 向导创建的存储过程

  单击 Next(下一步)按钮。向导将创建存储过程并在状态栏屏幕上指示其进度。完成后,可单击 Finish(完成)按钮退出向导。

  向导创建了配置完整的 DataAdapter,但未创建 DataSet 来存放数据。这是我们下一步要做的。在 Toolbox(工具框)的 Data(数据)选项卡中,拖动 DataSet 控件。出现配置屏幕时,选择 Untyped dataset(无类型的数据集)。

  现在我们准备使用 DataAdapter 填充数据集。在 btnFill 的 Click 事件中,放入以下两行代码:

SqlDataAdapter1.Fill(DataSet1, "Customers")
DataGrid1.DataSource = DataSet1.Tables("Customers")

  在 btnUpdate 的 Click 事件中,放入以下代码行:

  SqlDataAdapter1.Update(DataSet1, "Customers")

  现在我们有了一段使用存储过程进行数据访问的有效演示软件。可以运行程序并单击 Fill 按钮获取网格中的客户列表。然后,可在窗格中编辑客户记录并选择 Update 按钮将更改放回到数据库中。

注意:编辑第一列(即 CustomerID)时将出现异常,因为在 SQL Server 中不能更新数据库记录中的主键。

  查看由向导生成的代码会有所帮助,所有这些代码最初都隐藏在 Windows Form Designer generated code(Windows 窗体设计器生成的代码)区域中。单击该区域的加号可展开代码。注意以下代码,它对所需的 SQLDataAdapter 和四个命令对象进行了实例化:

Me.SqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter()
Me.SqlSelectCommand1 = New System.Data.SqlClient.SqlCommand()
Me.SqlInsertCommand1 = New System.Data.SqlClient.SqlCommand()
Me.SqlUpdateCommand1 = New System.Data.SqlClient.SqlCommand()
Me.SqlDeleteCommand1 = New System.Data.SqlClient.SqlCommand()

  此后的代码配置每个命令对象并为其创建参数集合。此代码与上一个示例相似,它们都使用带参数的存储过程。但向导生成的代码使用参数的某些附加属性,以使其与更改数据的存储过程协同工作。例如,用于创建 SQLInsertCommand1 的 CompanyName 参数的代码:

Me.SqlInsertCommand1.Parameters.Add(New _
System.Data.SqlClient.SqlParameter("@CompanyName", _
System.Data.SqlDbType.NVarChar, 40, "CompanyName"))

  在上一个示例中,我们只为参数名称、数据类型和长度等设置了属性

  此代码还会将参数的 SourceColumn 属性设置为值 CompanyName。该属性指示 DataSet 的 Customers DataTable 中与此参数对应的字段。这使 DataTable 中的值在插入操作期间自动插入到参数的 Value 属性中。让我们来详细介绍一下。

  调用 SQLDataAdapterUpdate 方法时,该方法将更新 DataSet 中的单个 DataTable。当逐行检查 DataTable 时,会查找需要更新、插入或删除的行。当找到需要插入到数据库中的行后,SQLDataAdapter 将使用由其 InsertCommand 属性设置的 Command 对象。这种情况下,Command 对象将访问 MSDNInsertCustomer 存储过程。

  在该存储过程运行前,每个参数的 Value 属性都必须从插入的行中导入。配置 SQLDataAdapter1 的代码将存储过程的每个参数与 DataTable 中的相应字段相关联。这样,新 DataTable 行中的数据将自动传输到存储过程的参数。

  其他存储过程参数的配置方法与此相似。但有一个不同之处值得注意。其他存储过程传入 DataTable 中数据的原始值,这些值用于检查数据是否在您不知情的情况下发生了更改。也就是说,如果您提取了某些数据,而其他人在您尝试更新前更改了该数据,您将收到并发异常。启动以上程序、提取客户,然后使用工具(例如 SQL Enterprise Manager)更改记录中的内容,便可以看到这种情况的发生。如果您在示例程序中更改同一记录并尝试进行更新,则会收到并发异常。

posted on 2005-01-10 14:33  icfarmer  阅读(989)  评论(1编辑  收藏  举报