用户可以把数据适配器理解为数据源和数据集之间的桥梁,他用来在数据源和数据集之间交换数据。.NET框架为用户提供了两种数据适配器:OleDbDataAdapter(用于访问任何OLEDB数据源)和SqlDataAdapter(专门用于访问SQL Server 7.0或更高版本的数据库)
通常一个数据适配器对应于数据集中的一个数据表(DataTable)。如果数据集中包含多个数据表,则需要使用多个数据适配器来把他们连接到数据源。
数据适配器的属性和方法
1、属性
在数据适配器中包含4个数据命令属性(他们分别对应于4中查询语句,都是SqlCommand或OldDbCommand类型的对象)。
- SelectCommand属性:对应于SELECT语句,用于从数据源中检索数据。例如下边的代码:
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
Dim myConnection As SqlConnection = New SqlConnection
myDataAdapter.SelectCommand = New SqlCommand("SELECT * FROM Categories-
ORDER BY CategoryID",myConnection)- UpdateCommand属性:对应于UPDATE语句,用于更新数据源。例如下边的代码:
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
Dim myConnection As SqlConnection = New SqlConnection
myDataAdapter.UpdateCommand = New SqlCommand("UPDATE Categories SET Description = 'Cheeses,Milk,Ice Cream'" + "WHERE CategoryName='Dairy Products'", myConnection)- InsertCommand属性:对应于INSERT语句,用于向数据源中插入新纪录。例如下边的代码:
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
Dim myConnection As SqlConnection = New SqlConnection
myDataAdapter.InsertCommand = New SqlCommand("INSERT INTO Categories_(CategoryName,Description,Picture)" + "Values(@ CategoryName,@Description,@Picture)", myConnection)- DeleteCommand属性:对应于DELETE语句,用于删除数据源中的记录。例如下边的代码:
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
Dim myConnection As SqlConnection = New SqlConnection
myDataAdapter.DeleteCommand = New SqlCommand("DELETE FROM Categories WHERE CategoryName='Produce'", myConnection)- AcceptChangesDuringFill属性:指定在把DataRow添加到DataTable中之后是否为它调用AcceptChanges方法
- TableMapping属性:用来在数据源中的列和数据集表中的列之间建立对应关系
- MissingMappingAction属性:指定TableMapping属性中缺少表或列时采取的措施。
用户可以指定枚举System.Data.MissingMappingAction中定义的3中措施之一,如下表,其中Passthrough为默认值
枚举成员 描述 Error 产生一个异常 Ignore 缺少的列或表将会被忽略 Passthrough 创建缺少的列或表并把它们添加到数据集中
例如下边的代码:Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
myDataAdapter.MissingMappingAction = System.Data.MissingMappingAction.Ignore
- MissingSchemaAction属性:指定当数据集中缺少表或列时采取的措施。枚举System.Data.MissingSchemaAction中定义了这些措施。如下表,其中默认值为Add
枚举成员 描述 Add 向数据集中添加必要的表或列 AddWithKey 向数据集中添加必要的列以及主键信息 Error 产生异常 Ignore 忽略缺少的表或列 例如下边的代码:
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
myDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey提示:
如果在执行数据命令之前,它使用的数据库连接处于关闭状态,则执行命令时将会打开该连接,然后处理数据,最后关闭该连接;如果执行命令前连接处于打开状态,则执行命令后,该连接仍将保持打开状态。另外,命令类必须与连接类匹配。例如:如果正在使用SqlConnection对象与SQL Server通信,则必须使用从SqlCommand类派生的命令。
2、方法
数据适配器中最主要的两个方法是Fill方法和Update方法。
其中,Fill方法执行数据适配器的SelectCommand属性中的查询语句(SELECT语句)从数据源中检索数据,然后使用检索结果更新数据集DataTable,如果DataTable不存在,则创建新的DataTable。另外,Fill方法还会根据MissingSchemaAction和MissingMappingAction属性的设置来处理数据集或TableMapping中缺少的表或列。如果SelectCommand属性中包含返回多个结果集的批语句,则Fill方法将会在数据集创建多个表并把结果集添加到相应的表中。注意:
在执行返回多个结果集的批语句时,数据集中必须包含主键信息。主键信息可以通过FillSchema方法设置或者通过把MissingSchemaAction属性设置AddWithKey来添加,另外,对于OLE DB,.NET数据提供程序,要处理返回多个结果集的批语句,必须要把MissingSchemaAction属性设置为AddWithKey。如果在填充数据集的时候出现错误,则填充操作将被中止,数据集中只包含发生错误之前的数据。
下面是使用不同的方法填充数据集:
Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter()
Dim myDataSet As DataSet = New DataSet
myDataAdapter.Fill(myDataSet)
''使用数据源中的表Categories填充数据集
myDataAdapter.Fill(myDataSet, "Categories")
''使用数据源表Categories中从第9个记录起的15条记录填充数据集
myDataAdapter.Fill(myDataSet, 9, 15, "Categories")Update方法调用UpdateCommand、InsertCommand或者DeleteCommand属性中的查询语句(UPDATE、INSERT或者DELETE语句)来使用数据集中的数据更新数据源。在调用这个方法时,数据适配器将根据数据集中数据的改变方式来确定使用哪一种查询语句更新数据源。例如下边的代码:
myDataAdapter.Update(myDataSet)
另外,在更新数据源时,用户还可以把数据集中的表或数据行(DataRow)数组作为参数,例如下边的代码:
Dim myDataTable As DataTable = New DataTable
myDataAdapter.Update(myDataTable)或
Dim myDataRowArray() As DataRow = myDataTable.Select()
……
myDataAdapter.Update(myDataRowArray)