当数据适配器从数据源读取数据时,它使用表映射确定将数据放在相应数据集表中的什么位置。映射将源中列名与数据集表中的列名链接起来。例如,来自数据源中
au_id 列的信息可能属于数据集表中的 author_id_number
列。
默认情况下,当使用 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 语句返回的列比数据集内需要的列多时很有用。