数据适配器中的表映射
更新:2007 年 11 月
当数据适配器从数据源读取数据时,它使用表映射确定将数据放在相应数据集表中的什么位置。映射将源中列名与数据集表中的列名链接起来。例如,来自数据源中 au_id 列的信息可能属于数据集表中的 author_id_number 列。
说明: |
---|
在 Visual Studio 的前一版本中,使用数据适配器在应用程序和数据库之间通信。尽管数据适配器仍是 .NET Framework 数据提供程序 (ADO.NET)的一个主要组件,TableAdapter 是由设计器生成的组件,这些组件简化了在应用程序与数据库之间移动数据的过程。有关使用 TableAdapter 的更多信息,请参见 TableAdapter 概述。 |
默认情况下,当使用 Visual Studio 工具从数据源中的信息生成数据集时,数据集元素具有与源中相同的名称。但是,也有数据源中的名称与数据集内的名称不匹配的时候:
数据集是自使用不同名称的现有架构创建的。
出于方便、可读性、便于与外语相互翻译或其他原因,希望更改数据集内的数据元素名。
当从适配器生成数据集时希望控制类型化数据成员的名称。
表映射结构
表映射是使用适配器的 TableMappings 属性建立的,它是一个类型为 DataTableMapping 的项的集合。被映射的每组表都有一个 DataTableMapping 对象。通常只有一个这样的项,因为适配器一般只与单个源表和单个数据集表关联。(但是,一个存储过程可以返回多个行集;如果是这样,第二个表以及后面的表将使用 TableMappings 集合中的第二个和后面的映射加以映射。)
每个映射项反过来包含一些属性来标识数据源表、数据集表,还包含一个 ColumnMappings 属性,该属性包含代表实际映射的项。
表映射工作方式
当调用数据适配器的 Fill 方法时,适配器通过下面的步骤确定将数据写到数据集内的什么位置:
适配器查找 TableMappings 对象中的每个源列名。
当找到源列名后,它将获取数据集表中相应列的匹配(映射)名。
使用从步骤 2 获取的名称,适配器将数据从源列写到相应的数据集列。
存在多种情况可能阻止适配器按照上面所列出的进程执行。其中两种主要情况为:
找不到某源列的映射。这可能是因为未对 TableMappings 属性进行定义,或某特定列未被映射。
要写入的列未在数据集的架构中定义(不论该列在 TableMappings 属性中是否映射)。
适配器支持两个属性,它们使您可以指定当任何一种情况发生时应怎样处理。这些情况不一定是错误情况,因为即使发生任一种情况,适配器仍可以填充数据集。
MissingMappingAction 属性使您可以指定当缺少映射时适配器应采取的操作。可能的设置有:
Passthrough - 适配器尝试将列加载到一个同名数据集列中。如果没有该名称的数据集列,则行为取决于 MissingSchemaAction 枚举设置(请参见下面的内容)。
Ignore - 未正确映射的列不加载到数据集内。
Error - 引发错误。
MissingSchemaAction 属性使您可以指定当适配器尝试将数据写到未在数据集的架构中定义的列中时应发生什么情况。可能的值有:
Add - 将表或列添加到架构和数据集。
AddWithKey - 将表或列与有关主键的信息一起添加到数据集和架构。
Ignore - 数据集架构中未表示的表或列不添加到数据集内。
Error - 适配器引发错误。
通常一起设置这两个属性以适应应用程序的特定需要。将 MissingMappingAction 属性设置为 Passthrough 并将 MissingSchemaAction 属性设置为 Add 会导致自动从数据集中的源复制表名和列名。
相反,可以在数据集架构严格定义的应用程序中指定错误检查。在这种情况下,当在数据集内没有明确定义目标列时从源获取数据可能违反业务规则或造成其他错误。
当希望确保仅向数据集加载在架构中显式定义的数据或在 TableMappings 属性中映射的数据时,请指定 Ignore。这在适配器所调用的存储过程或 SQL 语句返回的列比数据集内需要的列多时很有用。