15.9 DataSet和DataAdapter组件
本节介绍通过SqlConnection对象从数据库检索数据,实现对DataSet对象的填充。DataSet可以包括多张数据库表,这些表可以来自多个数据库。开发人员可以将DataSet对象绑定到Grid控件或其他控件来显示其中的数据,也可以通过改变DataSet对象里的排序和过滤条件来改变数据视图。但是在使用DataSet之前,必须向DataSet填充数据。
在清单15-7里,使用与清单15-6中相同的数据库连接字符串,通过构造器初始化DataAdapter对象。当DataAdapter被初始化后,就可以调用DataAdapter的Fill()方法填充DataSet对象。
清单15-7 填充DataSet
Public Function GetMyDataSet() As Data.DataSet
Dim conNwindCE As Data.SqlClient.SqlConnection
Dim adapterData As Data.SqlClient.SqlDataAdapter
Dim connString As String
Try
' 创建、打开数据库连接
connString = "server=192.168.0.10;database=Nwind_SQLCE;user id=sa;pwd=pword;"
conNwindCE = New Data.SqlClient.SqlConnection(connString)
' 创建命令对象
adapterData = New Data.SqlClient.SqlDataAdapter("SELECT * FROM Customers", connString)
Dim ds As Data.DataSet = New Data.DataSet
adapterData.Fill(ds)
Return ds
Catch ex As Data.SqlClient.SqlException
MessageBox.Show(ex.Message)
Finally
End Try
End Function
注意,使用SqlDataAdapter填充DataSet时,通常都会返回一个可用的DataSet对象。但是如果查询所执行的SQL语句不返回结果时,仍将返回一个包含有DataTable对象的可用DataSet。那么如何判断DataSet是空的呢?可以使用DataTable对象下面的DataRowCollection的Count属性进行判断。
DataSet不依赖数据源及数据库连接。在清单15-7里,DataAdapter能够自动打开数据库连接。GetMyDataSet函数将DataSet对象返回给函数调用者后,函数调用者可以浏览其中的数据;可以根据DataSet里的数据创建子DataSet对象;可以过滤数据;或者更新DataSet里的数据。而这些操作都不依赖数据库连接。
DataSet最常见的用途是将其绑定到一个具有DataSource属性的控件,例如将其绑定到DataGrid控件的DataSource属性,如以下代码所示:
……
Try
Dim ds As DataSet = GetMyDataSet()
Me.DataGrid1.DataSource = ds.Tables(0)
Catch ex As Exception
MsgBox(ex.Message)
End Try
……
上面代码的执行结果如图15-1所示。
图15-1 绑定DataSet到DataGrid 控件
可以使用多种方法访问存储在DataSet中的数据。清单15-8展示了一个访问存储在DataSet数据的示例。清单15-8使用与清单15-7中相同的连接设置来填充DataSet,然后遍历DataSet中第一张表的Rows集合读取记录数据。
清单15-8 访问DataSet数据
……
Dim conNwindCE As Data.SqlClient.SqlConnection
Dim adapterData As Data.SqlClient.SqlDataAdapter
Dim connString As String
Try
' 创建、打开数据库连接
connString = "server=192.168.0.10;database=Nwind_SQLCE;user id=sa;pwd=pword;"
conNwindCE = New Data.SqlClient.SqlConnection(connString)
' 创建 SqlDataAdapter 对象
adapterData = New Data.SqlClient.SqlDataAdapter("SELECT * FROM Customers", connString)
Dim ds As New Data.DataSet
adapterData.Fill(ds)
Dim strCustomerID As String
Dim strCustomerName As String
Dim strContactName As String
For Each dr As Data.DataRow In ds.Tables(0).Rows
strCustomerID = dr.Item(0)
strCustomerName = dr.Item(1)
strContactName = dr.Item("ContactName")
Next
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
End Try
……
![](https://i-blog.csdnimg.cn/blog_migrate/e21b254a9252a399e3f32740d79b9167.png)