本文提供了一个路线图,以了解和掌握 ADO.NET DataAdapter 对象。路线图文章提供了指向包括联机文档、 Microsoft 知识库文章和 Microsoft 白皮书可帮助您了解有关 Microsoft 产品或技术的有用信息的链接。
概述
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> .NET 数据提供程序 DataAdapter 对象自动换行到 DataSet 对象中读取记录,并更新数据库与 数据集 。DataAdapter 管理 命令 和 DataReader 对象,并简化了在同步过程。您可以使用 OleDbDataAdapter 对象来填充 数据集 从 Microsoft ActiveX 数据对象 (ADO) 记录集 或 记录 的对象。
DataAdapter 对象是数据库和 数据集 之间传输数据的只是一种方法。如果您需要填充或更新功能的更好地控制,您可以编写一个自定义的函数,来管理该过程并直接处理 命令 和 DataReader 对象。
有关在 连接 、 命令 和 DataReader 类、 如何实现.net 数据提供程序独立于或如何编写您自己的.net 数据提供程序上单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
313480
(http://support.microsoft.com/kb/313480/EN-US/ ) 指南信息:.net 数据提供程序
有关 DataSet 类单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
313485
(http://support.microsoft.com/kb/313485/EN-US/ ) ADO.NET 数据集、 DataView,和 DataViewManager 对象的信息: 指南
其他 ADO.NET 技术指南文章单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
313590
(http://support.microsoft.com/kb/313590/EN-US/ ) ADO.NET 指南信息:
体系结构
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script>DataAdapter 管理多个 命令 对象:
- SelectCommand
- DeleteCommand
- InsertCommand
- UpdateCommand
DataAdapter 包括三种主要方法:
- 填充 。此方法使用 DataReader 读取记录,然后将记录复制到 数据集 (或 数据表 对象)。许多应用程序 (尤其是基于 Web 的应用程序) 只需要对数据的只读访问权限。默认状态下,DataAdapter 检索只在架构所需的最小金额 (列名称和在数据类型),以支持只读操作。DataAdapter 使用 SelectCommand 属性返回一个 DataReader 从中读取记录。
- FillSchema 。此方法将查询的架构信息更新所需的数据库。这包括键列、 列,等等的为空性。若要配置 填充 方法以检索此附加的架构信息,请将 DataAdapter.MissingSchemaAction 属性值设置为 MissingSchemaAction.AddWithKey 。
您可以使用 SelectCommand 返回 DataReader 从中读取架构。由于 数据集 架构中检索数据的开销为一个可扩展标记语言 (XML) 文件存储架构,或使用类型化的 数据集 。
- 更新 。当您更新数据库时,DataAdapter 检查的 数据表 中的每个 DataRow 对象 RowState 属性。然后,DataAdapter 调用 DeleteCommand 、 InsertCommand 中,或 UpdateCommand 属性以更改相应数据库。您可以挂钩 RowUpdating 和 RowUpdated 事件来自定义 DataAdapter 处理更新的方式。
DataAdapter 不具有任何有关从读取它的数据库的信息,并写入 ; DataAdapter 可以只运行它管理命令。因此,DataAdapter 不会创建 DataRelation 对象 DataSet 中。若要创建 DataRelation 对象 DataSet 中,您必须使用下列方法之一:
- 在运行时以编程方式创建对象。
- 加载架构从 XML 架构定义 (XSD) 文件。
- 生成到设计时 数据集 架构的对象。
有关 ADO.NET DataAdapter 体系结构的详细信息,请参阅以下主题,Microsoft Visual Studio.net 联机帮助文档中 (在 Visual Studio.net 帮助 菜单上单击 内容
):
- visual.net Studio
- .NET 框架
- .NET 框架编程
- 访问与 ADO.NET 数据
- ADO.NET 的概述
- .NET Data Providers (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp)
如何对文章、 演练,和快速入门示例
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> Microsoft 知识库"如何"文章提供有关如何完成特定任务的分步指导。演练提供了指导您完成典型的应用程序开发方案的小型教程。 快速入门示例文件提供代码示例供您参考。
Visual Studio.net 联机帮助主题、 快速入门示例文件、 演练和各节按照 Microsoft 知识库文章介绍了如何使用 ADO.NET DataAdapter 。
快速入门示例
在以下两个位置之一的计算机上安装了快速入门示例文件。如果您安装快速入门示例文件的 Visual Studio.net,示例文件位于以下文件夹:
是 Files\Microsoft Visual Studio.NET\FrameworkSDK\Samples\QuickStart\...
如果您安装快速入门示例文件在.net 的开发平台,该文件位于以下文件夹中的示例:
是 Files\FrameworkSDK\Samples\QuickStart\...
Microsoft 知识库文章
填充数据集
<script type="text/javascript"> loadTOCNode(3, 'summary'); </script> 可以使用 DataAdapter 对象的 填充 方法来填充 数据集 的数据。默认状态下,Fill 方法只提供足够的架构的数据的只读访问权限。为了更新使用下列方法之一:
- 使用 FillSchema 方法。
- 从 XSD 文件加载架构。
- 使用类型化的 数据集 。
注 : 如果一个 Web 窗体应用程序使用只读数据,它是为应用程序绑定到一个 DataReader 而不是使用 DataAdapter 填充 数据集 的效率更高。
visual Studio.net 联机帮助文档
快速入门示例
如果您的计算机上安装了快速入门示例,以下子文件夹还包含其他示例:
- Adorstodataset 子文件夹 。此子文件夹中的示例使用 OleDbDataAdapter 类一个 ADODB.Recordset 读入 数据集 。此示例使用反射来打开 Recordset 后期绑定 (早期绑定是通常首选的)。
- Gettingdata 子文件夹 。此子文件夹中的示例使用 SqlDataAdapter 类来填充 数据集 。
- Relationaldata 子文件夹 。此子文件夹中的示例使用 SqlDataAdapter 填充 数据集 包含两个表。此示例创建 DataRelation 类,并使用 GetChildRows 方法来定位到子记录。
知识库文章
308072
(http://support.microsoft.com/kb/308072/EN-US/ ) 如何: 填充数据集来自 Oracle 存储过程,Visual basic.net 中使用 OLE DB.net 数据提供程序
310101
(http://support.microsoft.com/kb/310101/EN-US/ ) 如何: 填充数据集来自 Oracle 存储过程与 Visual C#.net 中使用 OLE DB.net 数据提供程序
310349
(http://support.microsoft.com/kb/310349/EN-US/ ) 如何: 使用该 OleDbDataAdapter 来填充数据集从 Visual Basic.net 中 ADO 记录集
更新单个表
<script type="text/javascript"> loadTOCNode(3, 'summary'); </script> 在单个表的更新中调用 DataAdapter 更新 的方法。默认状态下,Update 方法结束,并在方法遇到未能更新的行时引发 DBConcurrencyException 异常。由于并发冲突或违反约束的更新可能会失败的行。若要确定这,DataAdapter 检查 RowsAffected 属性所返回用来更新数据库命令。
如果数据库没有返回 RowsAffected 属性 (例如对于 SQL Server SET NOCOUNT ON),DataAdapter 假定所有更新都成功。如果您在 DataAdapter.ContinueUpdateOnError 属性设置为 True ,DataAdapter 尝试更新 DataSet 中的所有行。未能更新的 DataRow 对象的 HasErrors 和 RowError 属性记录 DataAdapter 遇到任何错误。
其他说明
- 如果主键是一个自动编号或标识的值,如果该数据库自动生成该主密钥,或者数据库填充默认字段值必须在 InsertCommand 属性以获取新的字段值中再次选择该记录。
如果该数据库可以修改字段值 (例如对于通过更新触发器) 一个 UPDATE 语句进行过程中,您必须 UpdateCommand 属性中再次选择该记录。
- 如果主键是自动编号或标识列,数据集 可以自动生成临时您写回数据到数据库时,将更新的值。若要不必在数据库中已存在的行与冲突设置 DataColumn.AutoIncrementSeed 和 DataColumn.AutoIncrementStep 属性为-1。这将导致具有负的键值,直到它们写入数据库的新行。
visual Studio.net 联机帮助文档
快速入门示例
如果您的计算机上安装了快速入门示例,以下子文件夹还包含其他示例:
- Adooverview4 子文件夹 。此子文件夹中的示例生成 SqlDataAdapter 的命令。此示例使用 SqlDataAdapter 来填充 数据集 和写回更新数据库。
- Updatingdata 子文件夹 。此子文件夹中的示例演示如何使用 SqlDataAdapter 和 SqlCommandBuilder 来从更新或填充 数据集 。
知识库文章
301248
(http://support.microsoft.com/kb/301248/EN-US/ ) 如何: 使用 Visual Basic.net 更新从数据集对象的数据库
307587
(http://support.microsoft.com/kb/307587/EN-US/ ) 如何: 使用 Visual C#.net 更新从数据集对象的数据库
308055
(http://support.microsoft.com/kb/308055/EN-US/ ) 如何: 使用 Visual Basic.net 中的 SqlDataAdapter 对象更新 SQL Server 数据库
308507
(http://support.microsoft.com/kb/308507/EN-US/ ) 如何: 使用 Visual C#.net 中的 SqlDataAdapter 对象更新 SQL Server 数据库
308510
(http://support.microsoft.com/kb/308510/EN-US/ ) 如何: 使用 Visual c + +.net 中的 SqlDataAdapter 对象更新 SQL Server 数据库
310347
(http://support.microsoft.com/kb/310347/EN-US/ ) 如何: 填充数据集从数据源和使用 Visual Basic.net 中更新另一个数据源
313028
(http://support.microsoft.com/kb/313028/EN-US/ ) 如何: 填充数据集从数据源和使用 Visual C#.net 更新另一个数据源
310351
(http://support.microsoft.com/kb/310351/EN-US/ ) 如何: 返回更新后的错误时您正在使用一个 DataAdapter 和 ADO.NET 和 Visual Studio.net 中的数据集
308042
(http://support.microsoft.com/kb/308042/EN-US/ ) 如何: 读取和写入 Visual basic.net 中使用 ADO.NET 的 BLOB 数据
309158
(http://support.microsoft.com/kb/309158/EN-US/ ) 如何: 读取和使用 Visual C#.net 使用 ADO.NET 写入 BLOB 数据
308056
(http://support.microsoft.com/kb/308056/EN-US/ ) 如何: 更新服务器数据通过 Web 服务使用 ADO.net 和 Visual Basic.net
310143
(http://support.microsoft.com/kb/310143/EN-US/ ) 如何: 更新服务器数据通过 Web 服务使用 ADO.net 和 Visual C#.net
更新父和子行
<script type="text/javascript"> loadTOCNode(3, 'summary'); </script> 您可能会发现更难更新父行和比将如果您更新发送回数据库更新发生一个批处理过程中的子行。若要不必引用完整性问题 (您将需要为每个 数据表 的一个 DataAdapter ) 对数据库中,您必须更新以下顺序中的行:
- 进程孙行都将被删除。
- 进程中删除的子行。
- 进程中删除的父行。
- 已更新的过程父行。
- 插入的进程父行。
- 已更新的过程子行。
- 过程插入的子行。
- 已更新的过程孙行。
- 进程孙插入的行。
若要获取已删除的行的子集,DataTable.Select 方法传递 DataViewRowState.Deleted 。若要获取已更新的行的子集,DataTable.Select 方法传递 DataViewRowState.ModifiedCurrent 。若要获取的插入行的子集,DataTable.Select 方法传递 DataViewRowState.Added 。
其他说明
<script type="text/javascript"> loadTOCNode(3, 'summary'); </script>
- 如果行添加到数据库后,您 不能 修改主关键字,您可以使用一个步骤来处理更新和插入的行。
- 如果某行添加到数据库后,您 可以 修改主关键字,则需要级联更新后的密钥值子记录的数据库机制。 没有这,该更新会导致违反引用完整性。当您执行并发检查时,还必须更改 UpdateCommand 属性接受是原始的子表中的或外键的当前值。
- 如果主键是一个自动编号或标识的值,如果该数据库自动生成该主密钥,或者数据库填充默认字段值必须在 InsertCommand 属性以获取新的字段值中再次选择该记录。DataSet 会自动传播到子记录新的密钥值以便在插入时,这些记录具有正确的外键值。
- 如果您在更新中必须是一个 DiffGram 合并回主 数据集 ,DataSet.Merge 方法正常,工作项的值不能更改。如果项的值可能是可以更改 (例如对于如果向具有标识列的表中插入值),您必须挂钩的 DataAdapter RowUpdated 事件。这样可以防止 DataAdapter 自动调用 DataRow.AcceptChanges 方法。合并 方法后,您必须在主 数据集 上调用此方法。
visual Studio.net 联机帮助文档
映射表和字段
<script type="text/javascript"> loadTOCNode(3, 'summary'); </script> 当您使用 DataAdapter.Fill 和 更新 方法时,您指定 数据表 名称。数据表 名称可以不同于在数据库表名称。此外,DataColumn 名称可以不同于该列名称在数据库上。表映射和域的映射是很有用,如果您需要将两个表中的数据合并到一个 数据表 ,尤其是如果字段名称不完全匹配。
您还可以创建 TableMapping 和 FieldMapping 对象并将这些对象添加到 DataAdapter.TableMappings 集合。如果创建这些对象,并将它们添加到此集合没有显式指定的 填充 和 更新 方法过程中的 数据表 名称。如果将 DataAdapter 组件添加到您的项目在 Visual Studio.net 中,您可以通过在设计时使用属性页编辑 TableMapping 和 FieldMapping 对象。
visual Studio.net 联机帮助文档
MSDN 文章
:
Table Mapping in ADO.NET
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndive/html/Data03142002.asp?frame=true)
生成命令和参数
<script type="text/javascript"> loadTOCNode(3, 'summary'); </script> 当您使用该 SqlClient、 OleDb 和 Odbc.net 数据提供程序时,该命令可以是 SQL 语句,SQL 批处理或存储的过程。但是,第三方.net 数据提供程序可能不支持命令语言。
您可以使用下列方法之一来创建命令:
- 可视化设计工具 。当您拖到窗体或组件设计曲面图上从服务器资源管理器中拖动表时可视化设计工具在属性窗格中创建 的连接 和 DataAdapter 对象,可以进行处理。可以使用 $ 图形命令生成器和向导来配置 DataAdapter 。这些图形命令生成器和向导包括诸如创建重读的存储的过程更新记录,开放式并发检查的各种配置选项等等。若要查看生成的代码,单击展开该设计器创建的区域代码窗口。
- CommandBuilder 对象 。每个.net 数据提供程序包含 CommandBuilder 对象。此对象挂钩的 DataAdapter RowUpdating 事件。CommandBuilder 对象使用 SelectCommand 以此为基础,用于生成 (在运行时) 处理这些更新所需的任何命令。但是,CommandBuilder 要求您加载到 数据集 的相应的架构,并使该数据库的其他架构调用。如此一来,它可以使用 CommandBuilder 相当昂贵。
CommandBuilder 对象不包含任何选项来自定义您是如何构建命令。CommandBuilder 始终使用乐观并发检查,并且永远不会 rereads 记录。此对象所以在只有少数的情况下非常有用。不部署此方法在其中的数据库性能是关键的系统上。您不能修改 CommandBuilder 生成的命令。如果您执行的操作 CommandBuilder 重新在下一次尝试更新的过程中生成命令。
- 自定义命令 。最大的灵活性和控制,您可以编写自己的命令和参数绑定。例如对于必须编写自定义命令,如果您对并发检查而不是检查每个字段值的使用 时间戳 属性。
当您将创建您自己的命令,如果插入或更新后,再次选择记录时,您必须适当地设置 Command.UpdatedRowSource 属性。您在创建参数时必须将它们绑定到记录的特定 RowVersion 。例如对于您在运行 UPDATE 语句时将更新后的值的参数绑定到 DataRowVersion.Current ,然后将并发检查参数绑定到 DataRowVersion.Original 。检查要查看如何使用窗体命令文本和参数的设计器生成的代码。
visual Studio.net 联机帮助文档
挂钩事件
<script type="text/javascript"> loadTOCNode(3, 'summary'); </script>DataAdapter 会引发以下三个事件:
- FillError 。DataAdapter 引发 FillError 事件 (如 DataSet 中违反约束) 的 填充 方法过程中出现问题时。
- RowUpdating 。DataAdapter 引发 RowUpdating 事件立即为每个 DataRow 运行 DeleteCommand 、 InsertCommand 或 UpdateCommand 之前。使用此事件可以有选择地跳过更新的行。
- RowUpdated 。DataAdapter 引发 RowUpdated 事件立即运行命令后。使用此事件可以监视更新,也可以防止 DataAdapter 自动调用 DataRow AcceptChanges 的状态。
visual Studio.net 联机帮助文档
故障排除
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> 如果遇到问题,并且需要问题的答案,请参阅 MSDN 新闻组。MSDN 新闻组是最佳的位置,以获得您的问题的答案。在 MSDN 新闻组中,您可以与同行共享您的经验或搜索 Microsoft 知识库文章有关特定问题。