同一个 Source 元素,换个位置就报错:绑定类型必须配对

同一个 Source 元素,换个位置就报错:绑定类型必须配对

一、它到底在做什么

Source 元素(Binding 类型)的职责只有一句话:指明父元素绑定的数据来自哪里。它本身不存数据,只描述"从哪个数据源、哪张表、哪一列取数"这层关系。

所以它几乎出现在所有需要"连数据"的地方。按官方文档列出的父元素,一共有十类:

父元素该位置允许的绑定类型
聚合实例(AggregationInstance)、分区(Partition)表格绑定(TabularBinding)
聚合实例度量值列绑定(ColumnBinding)
立方体(Cube)数据源视图绑定(DataSourceViewBinding)
维度(Dimension)立方体维度、数据源视图、维度、时间四类绑定
维度属性(DimensionAttribute)属性绑定、用户定义分组绑定
度量值组(MeasureGroup)度量值组绑定
度量值组维度度量值组维度绑定
挖掘结构(MiningStructure)立方体维度、数据源视图、维度三类绑定
主动缓存(ProactiveCaching)由处理与通知选项决定,随父元素变化

二、最容易踩的坑:数据项(DataItem)下的允许类型

DataItem 是个特殊位置——它允许的绑定类型取决于 DataItem 自己的父元素,一共有三组规则:

DataItem 的父元素允许的绑定类型
维度属性属性绑定、列绑定、时间属性绑定(仅限键列 KeyColumns)
度量值组属性属性绑定、列绑定、继承绑定
标量挖掘结构列列绑定
这里最隐蔽的限制是"仅限键列":时间属性绑定看着可用,但只要绑定的不是键列,就会失败。报错信息通常不会告诉你这条,只会说绑定无效。

三、两个容易被忽略的约定

可选性:这个元素是 0 到 1 的,即可选、且最多出现一次。它不是必填项,但一旦写了就只能有一个——重复配置会导致解析失败,而不是"后一个覆盖前一个"。

默认值:文档标注为"无"。这意味着不写它就是真的没有,系统不会替你补一个默认绑定。所以省略 Source 的元素,必须通过其他机制拿到数据,否则处理阶段就会报缺绑定。

四、排查思路:先看位置,再看类型

遇到绑定相关的报错,按这个顺序查,比盲改配置有效:

  1. 确认这个 Source 挂在哪个父元素下——先定位位置,才能知道允许哪些类型;
  2. 如果是 DataItem 下,再确认 DataItem 的父元素是哪一类,特别是"是否在键列范围";
  3. 最后检查数量:是否不小心写了两个 Source;
  4. 检查数据源视图与维度的对应关系是否真实存在,绑定类型对了但目标不存在,同样会失败。

一句话总结:Source 是个"接口"而不是"数据",它能不能用,取决于它插在哪个插座上。先认插座,再选插头,这个元素就不会再让你踩坑。