扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:COMMERCE·TANG 来源:yesky 2007年10月15日
关键字:
以上示例使用存储过程从数据库中提取信息。在复杂应用程序中使用存储过程更新、插入和删除记录也很常见。让我们看看如何使用 ADO.NET 完成该操作。
在第一个示例中,我们将使用 Visual Studio? .NET 中的向导编写一个存储过程集合,并创建使用这些过程的代码。尽管我们只需在此示例中编写最少量的代码,但检查向导创建的代码有助于我们理解除获取数据以外,有关与存储过程交互操作的过程。
在此示例中,我们将使用 Northwind 示例数据库中的 Customers 表。安装后的 Northwind 数据库中不包含用于更新、插入或删除客户的存储过程,但 Visual Studio .NET 中的 DataAdapter Configuration Wizard(数据适配器配置向导)可轻松地为我们编写一些存储过程。
启动新的 Windows Application(Windows 应用程序)项目。在空白的 Form1 上,放置一个 DataGrid 和两个按钮。和先前一样,更改 DataGrid 的 Anchor 属性使之锚定到全部四个边。将按钮命名为 btnFill 和 btnUpdate,并分别将其 Text 属性更改为 Fill 和 Update。
转到 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 操作。按以下方法对其命名:
选择 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 属性中。让我们来详细介绍一下。
调用 SQLDataAdapter 的 Update 方法时,该方法将更新 DataSet 中的单个 DataTable。当逐行检查 DataTable 时,会查找需要更新、插入或删除的行。当找到需要插入到数据库中的行后,SQLDataAdapter 将使用由其 InsertCommand 属性设置的 Command 对象。这种情况下,Command 对象将访问 MSDNInsertCustomer 存储过程。
在该存储过程运行前,每个参数的 Value 属性都必须从插入的行中导入。配置 SQLDataAdapter1 的代码将存储过程的每个参数与 DataTable 中的相应字段相关联。这样,新 DataTable 行中的数据将自动传输到存储过程的参数。
其他存储过程参数的配置方法与此相似。但有一个不同之处值得注意。其他存储过程传入 DataTable 中数据的原始值,这些值用于检查数据是否在您不知情的情况下发生了更改。也就是说,如果您提取了某些数据,而其他人在您尝试更新前更改了该数据,您将收到并发异常。启动以上程序、提取客户,然后使用工具(例如 SQL Enterprise Manager)更改记录中的内容,便可以看到这种情况的发生。如果您在示例程序中更改同一记录并尝试进行更新,则会收到并发异常。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者