配置数据集
在 Form1 上,右键单击 SqlDataAdapter1 图标,然后单击 Generate Dataset(生成数据集)。
图 16:为 SqlDataAdapter 生成数据集
在 Generate Dataset(生成数据集)对话框中,选择 New(新建),然后输入名称 BrowseInvoiceTotalsDS。
在页面下部的窗口中,BrowseInvoiceTotals(SqlDataAdapter1) 应该被选中。单击 OK(确定)。
图 17:生成数据集属性表
下一步,我们将为 Form1 创建窗体元素。
创建窗体元素
向 Form1 添加一个 DataGrid 控件。
打开工具箱,然后单击 Windows Forms(Windows 窗体)。
将一个 DataGrid 控件拖放到 Form1 上,右键单击 DataGrid 控件,单击 Properties(属性)。将 DataGrid 控件的 CaptionText 属性更改为 Invoice Report。
配置 DataGrid 控件的属性以将其绑定到数据:在 Properties(属性)的 Data(数据)部分中,将 DataSource 属性设置为 BrowseInvoiceTotalsDS1.BrowseInvoiceTotals。
图 18:DataGrid 属性页(单击图片以查看大图像)
重新设置 DataGrid 控件的大小,使所有的列都可见。
要填充数据集,向 Form1 中添加一个按钮,然后将其 Text 和 Name 属性更改为 RunReport。
双击按钮以打开代码窗口。将以下代码行添加到 RunReport_Click 子例程中并保存该应用程序:
BrowseInvoiceTotalsDS1.Clear
' 使用 SqlDataAdapter 填充 DS
SqlDataAdapter1.Fill(BrowseInvoiceTotalsDS1)
现在,可以测试我们的应用程序了。运行该应用程序,然后单击 RunReport 按钮。SqlDataAdapter 将连接到数据库,运行我们的存储过程和函数,加载数据集并将数据传递到数据网格中。输出结果应类似于图 19 所示的结果。
图 19:示例应用程序输出结果(单击图片以查看大图像)
下一步,我们将创建一个数据维护窗体。
创建数据维护窗体
向 ServiceCall 项目中添加一个新窗体 (Form2):在解决方案资源管理器中,右键单击项目名称,单击 Add(添加),然后单击 Add Windows Form(添加 Windows 窗体)。
在 Templates(模板)下,单击 Windows Form(Windows 窗体)模板,然后单击 Open(打开)。
向窗体中添加一个 SqlDataAdapter 控件。将启动数据适配器配置向导。
为 SqlDataAdapter 选择现有 ServiceCall 连接。对于此 SqlDataAdapter 控件,我们将让 Visual Studio .NET 为我们创建所需的存储过程。
单击 Create new stored procedures(创建新存储过程),然后单击 Next(下一步)。将打开 Generate the stored procedures(生成存储过程)页面。
单击查询生成器,将 Customers 表添加到查询,然后关闭 Add Table(添加表)对话框。
在关系图窗格中,选择所有的列,单击 OK(确定),然后单击 Next(下一步)。
在 Create the Stored Procedures(创建存储过程)属性页中,分别为四个新存储过程提供一个名称(此示例中使用了 CustomersSelect、CustomersDelete、CustomersInsert 和 CustomersUpdate),然后单击 Next(下一步)。
当向导的最后一页显示成功生成所有存储过程的消息时,单击 Finish(完成)。
打开 SqlDataAdapter 控件的属性页,查看以下属性;这些属性被设置为我们所提供的存储过程名称值:
SelectCommand.CommandText 的值为 CustomersSelect。
DeleteCommand.CommandText 的值为 CustomersDelete。
InsertCommand.CommandText 的值为 CustomersInsert。
UpdateCommand.CommandText 的值为 CustomersUpdate。
Visual Studio .NET 基于我们提供的 Select 语句创建了四个存储过程,将其编译到数据库,并配置了 SqlDataAdapter 控件以使用这些存储过程。
下一步要生成我们为 Form2 创建的 SqlDataAdapter 的数据集。
生成数据集
右键单击 SqlDataAdapter,然后单击 Generate DataSet(生成数据集)。
将数据集命名为 CustomersDS。
向窗体中添加一个 DataGrid 控件,将 DataSource 属性设置为 CustomersDS1.Customers,将 CaptionText 属性设置为 Maintain Customers。
重新设置 DataGrid 控件的大小,使所有的列都可见。
在数据网格下添加一个按钮,将其 Text 属性和 Name 属性更改为 Load。
在第一个按钮的旁边添加另一个按钮,将其 Text 属性和 Name 属性更改为 Update。
双击 Load 按钮以打开代码窗口,然后向 Load 按钮的单击事件中添加以下代码:
CustomersDS1.Clear()
SqlDataAdapter1.Fill(CustomersDS1)
在 Update 按钮的单击事件中,添加以下代码:
SqlDataAdapter1.Update(CustomersDS1)
在运行应用程序之前,必须将项目的 Startup 对象更改为 Form2。
更改 Startup 对象
在解决方案资源管理器中,右键单击 ServiceCall 项目,然后单击 Properties(属性)。
在 Startup object(Startup 对象)下,将 Startup 对象更改为 Form2,然后单击 OK(确定)。
运行应用程序以打开维护窗体 (Form2)。单击 Load 按钮以加载数据网格,其中带有表中的现有数据。屏幕应类似于图 20 所示。
图 20:示例应用程序输出结果(单击图片以查看大图像)
更新 ServiceCall 数据库
要删除行,请单击该行,然后按 Delete 键。
要添加新行,请在网格末尾单击空行中的任何一个单元格,然后提供相应的值。
完成更改后,单击 Update(更新)。
系统检查网格中每一行的 RowStatus,调用相应的存储过程,并传入正确的参数以处理请求的操作。
此示例展示了 Visual Studio .NET IDE 和框架的强大功能。我们仅使用了几行代码,就创建了功能完备的表维护应用程序。
使用 ADO.NET 访问 SQL Server
Microsoft .NET 框架提供了新版本的 ADO,称为 ADO.NET。ADO.NET 的功能得到了加强,能够更好地支持分布式应用程序的开发,并主要依赖 XML 作为其内部数据结构。
在以前版本的 ADO 中,Recordset 对象是开发人员用于处理来自数据存储的数据的主要对象。在 ADO.NET 中,DataSet 对象取代了 Recordset 对象。一个 DataSet 就是用户使用的数据在内存中的副本。一个 DataSet 可以包含一个或多个 DataTable。您可以将 DataSet 视为一个虚拟关系数据库。DataSet 与原始数据源完全无关,而且并非设计为与数据源直接通信。ADO.NET 是使用托管提供程序与数据源进行通信的。
ADO.NET 提供两种托管提供程序:一种用于 SQL Server 数据库,另一种用于任何 OLE DB 兼容数据库。到目前为止,我们创建的所有示例都使用了 SQL Server 托管提供程序。如果查看工具箱中 Data(数据)下的选项,会注意到三对名称相同而前缀不同的控件。下表列出了这三对控件。
前缀为 OLEDB 的控件表示 OLE DB 托管提供程序,可用于访问任何与 OLE DB 兼容的数据库。这些控件与当前的 ADO 对象类似,但已被改写为托管代码以便在 .NET 框架中使用。
前缀为 SQL 的控件表示 SQL Server 托管提供程序,只能用于 SQL Server。与其 OLE DB 的对应控件相比,这些控件具有一些优点。首先,这些对象使用本地表格数据流 (TDS) 接口以获得最佳性能。OLE DB 对象所需的其他接口层已被删除,这使得数据库的访问速度更快。其次,从这些控件中创建的 SQL 对象具有其他一些方法,这些方法利用了专用于 SQL Server 的功能。这为使用 SQL Server 进行设计和编程提供了更大的灵活性。
我们在前面创建的示例应用程序中使用了 ADO.NET,而 Visual Studio .NET 为我们处理了大多数编码工作,我们所要做的就是通过 IDE 的用户界面配置数据集和数据适配器。现在,让我们看看使用 ADO.NET 从表中选择、插入、更新和删除数据时所需要的 Microsoft Visual Basic® .NET 编码。首先看一下 Select 语句的代码:
Dim strCmdText As String
Dim rowsProcessed As Integer
Dim CustomerDS As New DataSet()
strCmdText = "Select * from Customers"
Dim SqlDataAdapter2 As New SqlDataAdapter(strCmdText, _
"Data Source=localhost;Initial Catalog=ServiceCall;User
ID=sa;passsword=yourpassword")
SqlDataAdapter2.Fill(CustomerDS, "Customers")
在此代码示例中,我们首先定义了要使用的变量和对象,包括 CustomersDS,它是一个 ADO.NET DataSet 对象。然后我们定义了查询,该查询将填充变量 strCmdText 中的数据集。下一步,我们定义一个 ADO.NET SqlDataAdapter 对象 (SqlDataAdapter2),将查询和数据库连接字符串作为参数提供。请注意我们使用的是 SQL Server ADO.NET 托管提供程序。最后,我们通过调用 SqlDataAdapter 对象的 Fill 方法,填充 CustomerDS 并在名为 Customers 的 DataSet 中创建一个表。
因为 SqlDataAdapter2 使用查询和连接串字符串进行了定义,