ASSL 的 DataType 元素:能用的类型其实只有这 13 个

ASSL 的 DataType 元素:能用的类型其实只有这 13 个

一、DataType 元素管什么

DataType 元素定义关联元素的数据类型。它可以出现在两个父元素下:DataItem 和 Measure(度量值)。

它的数据类型是字符串(枚举),默认值为 None(无默认值),出现次数 0-1,即可出现一次且仅一次。它没有子元素。

关键前提:DataType 的取值定义在 System.Data.OleDb.OleDbType 枚举里,但只有下表列出的枚举值在 DataType 元素中有效。也就是说,枚举里有不等于这里能用。

二、13 个有效取值与对应关系

DataType 值含义.NET 对应OLE DB 对应
BigInt64 位有符号整数Int64DBTYPE_I8
Bool布尔值BooleanDBTYPE_BOOL
Currency货币值,精度到货币单位的万分之一DecimalDBTYPE_CY
Date日期数据,以双精度浮点数存储DateTimeDBTYPE_DATE
Double双精度浮点数DoubleDBTYPE_R8
Integer32 位有符号整数Int32DBTYPE_I4
Single单精度浮点数SingleDBTYPE_R4
SmallInt16 位有符号整数Int16DBTYPE_I2
TinyInt8 位有符号整数SByteDBTYPE_I1
UnsignedBigInt64 位无符号整数UInt64DBTYPE_UI8
UnsignedInt32 位无符号整数UInt32DBTYPE_UI4
UnsignedSmallInt16 位无符号整数UInt16DBTYPE_UI2
WChar以 null 结尾的 Unicode 字符流StringDBTYPE_WSTR

还有一个特殊取值 Inherited:表示继承 Measure 的 Source 元素中所包含 DataItem 的数据类型。该取值仅适用于 Measure 元素。

三、三个最容易选错的类型

其一,Date 不是「日期」,是「天数」。它以双精度浮点数存储,整数部分是从 1899 年 12 月 30 日起的天数,小数部分是一天的比例。这解释了为什么它在 .NET 里映射到 DateTime,在 OLE DB 里映射到 DBTYPE_DATE——它本质是数字而非字符串。

其二,Currency 不是浮点数。取值范围从 -2^63 到 2^63-1(即 -922,337,203,685,477.5808 到 +922,337,203,685,477.5807),精度到货币单位的万分之一。它在 .NET 里映射到 Decimal 而非 Double,在 OLE DB 里对应专有的 DBTYPE_CY。做金额汇总的度量选错类型,尾数会飘。

其三,WChar 是「以 null 结尾」的流。它不是普通字符串,而是带 null 终止符的 Unicode 字符流,映射到 .NET 的 String、OLE DB 的 DBTYPE_WSTR。做维度键或长文本时要清楚这个语义。

四、选型时怎么想

  • 计数和序号:用 Integer 或 BigInt,需要允许负数时不要用 Unsigned 系列。
  • 金额:用 Currency 或 Double。追求精确汇总用 Currency,要参与科学计算用 Double。
  • 布尔标记:用 Bool。
  • 日期时间:用 Date,注意它底层是数字,跨系统对接时留意编码。
  • 文本:用 WChar。
  • 继承上游类型:Measure 里可以用 Inherited 避免重复声明,但要清楚它依赖 Source 里 DataItem 的定义是否一致。
注意:DataItem 里的 DataType 与 Measure 里的 DataType 语义不完全一样。Inherited 只在 Measure 下可用,DataItem 下并没有这个选项。