当数据适配器从数据源读取数据时,它使用表映射确定将数据放在相应数据集表中的什么位置。映射将源中列名与数据集表中的列名链接起来。例如,来自数据源中 au_id 列的信息可能属于数据集表中的 author_id_number 列。

默认情况下,当使用 Visual Studio 工具从数据源中的信息生成数据集时,数据集元素具有与源中相同的名称。但是,也有数据源中的名称与数据集内的名称不匹配的时候:

表映射结构

表映射是使用适配器的 TableMappings 属性建立的,该属性是 DataTableMapping 类型的项的集合。被映射的每组表都有一个 DataTableMapping 对象。通常只有一个这样的项,因为适配器一般只与单个源表和单个数据集表关联。(但是,一个存储过程可以返回多个行集;如果是这样,第二个表以及后面的表将使用 TableMappings 集合中的第二个和后面的映射加以映射。)

每个映射项反过来包含一些属性来标识数据源表、数据集表,还包含一个 ColumnMappings 属性,该属性包含代表实际映射的项。

表映射工作方式

当调用数据适配器的 Fill 方法时,适配器通过下列进程确定将数据写到数据集内的什么位置:

  1. 适配器查找 TableMappings 对象中的每个源列名。
  2. 当找到源列名后,它将获取数据集表中相应列的匹配(映射)名。
  3. 使用从步骤 2 获取的名称,适配器将数据从源列写到相应的数据集列。

存在多种情况可能阻止适配器按照上面所列出的进程执行。其中两种主要情况为:

适配器支持两个属性,它们使您可以指定当任何一种情况发生时应怎样处理。这些情况不一定是错误情况,因为即使发生任一种情况,适配器仍可以填充数据集。

MissingMappingAction 属性使您可以指定当缺少映射时适配器应采取的操作。可能的设置有:

MissingSchemaAction 属性使您可以指定当适配器尝试将数据写到未在数据集的架构中定义的列中时应发生什么情况。可能的值是:

通常一起设置这两个属性以适应应用程序的特定需要。将 MissingMappingAction 属性设置为 Passthrough,并将 MissingSchemaAction 设置为 Add,将具有自动从源将表名和列名复制到数据集的效果。

相反,可以在数据集架构严格定义的应用程序中指定错误检查。在这种情况下,当在数据集内没有明确定义目标列时从源获取数据可能违反业务规则或造成其他错误。

当希望确保仅向数据集加载在架构中显式定义的数据或在 TableMappings 属性中映射的数据时,请指定 Ignore。这在适配器所调用的存储过程或 SQL 语句返回的列比数据集内需要的列多时很有用。