行集和参数中的数据类型映射
在行集中,SQL Server Native Client OLE DB 访问接口通过使用在 IColumnsInfo::GetColumnInfo 和 ICommandWithParameters::GetParameterInfo 函数中报告的以下 OLE DB 已定义数据类型,以参数值的形式表示 SQL Server 数据。
SQL Server 数据类型 |
OLE DB 数据类型 |
---|---|
bigint |
DBTYPE_I8 |
binary |
DBTYPE_BYTES |
bit |
DBTYPE_BOOL |
char |
DBTYPE_STR |
datetime |
DBTYPE_DBTIMESTAMP |
decimal |
DBTYPE_NUMERIC |
float |
DBTYPE_R8 |
image |
DBTYPE_BYTES |
int |
DBTYPE_I4 |
money |
DBTYPE_CY |
nchar |
DBTYPE_WSTR |
ntext |
DBTYPE_WSTR |
numeric |
DBTYPE_NUMERIC |
nvarchar |
DBTYPE_WSTR |
real |
DBTYPE_R4 |
smalldatetime |
DBTYPE_DBTIMESTAMP |
smallint |
DBTYPE_I2 |
smallmoney |
DBTYPE_CY |
sql_variant |
DBTYPE_VARIANT、DBTYPE_SQLVARIANT |
sysname |
DBTYPE_WSTR |
text |
DBTYPE_STR |
timestamp |
DBTYPE_BYTES |
tinyint |
DBTYPE_UI1 |
UDT |
DBTYPE_UDT |
uniqueidentifier |
DBTYPE_GUID |
varbinary |
DBTYPE_BYTES |
varchar |
DBTYPE_STR |
XML |
DBTYPE_XML |
SQL Server Native Client OLE DB 访问接口支持使用者请求的数据转换,如上图所示。
sql_variant 对象可以保留除 text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、timestamp 和 Microsoft .NET Framework 公共语言运行时 (CLR) 用户定义类型以外的任意 SQL Server 数据类型的数据。另外,sql_variant 数据实例还不能将 sql_variant 作为其基础的基本数据类型。例如,列中的某些行可能包含 smallint 值,而其他某些行可能包含 float 值,剩余的行则包含 char/nchar 值。
注意 |
---|
sql_variant 数据类型类似于 Microsoft Visual Basic® 中的 Variant 数据类型以及 OLEDB 中的 DBTYPE_VARIANT 和 DBTYPE_SQLVARIANT。 |
当提取 sql_variant 数据作为 DBTYPE_VARIANT 时,该数据被放置到缓冲区的 VARIANT 结构中。但 VARIANT 结构中的子类型可能无法映射为 sql_variant 数据类型中定义的子类型。然后,必须提取 sql_variant 数据作为 DBTYPE_SQLVARIANT,以使所有子类型匹配。
DBTYPE_SQLVARIANT 数据类型
为支持 sql_variant 数据类型,SQL Server Native Client OLE DB 访问接口公开名为 DBTYPE_SQLVARIANT 的特定于访问接口的数据类型。当提取 sql_variant 数据作为 DBTYPE_SQLVARIANT 时,该数据存储到特定于访问接口的 SSVARIANT 结构中。SSVARIANT 结构包含与 sql_variant 数据类型的子类型匹配的所有子类型。
此外,还必须将 SSPROP_ALLOWNATIVEVARIANT 会话属性设置为 TRUE。
特定于访问接口的 SSPROP_ALLOWNATIVEVARIANT 属性
提取数据时,您可以显式指定应为列或参数返回的数据类型。还可以使用 IColumnsInfo 获取列信息,并将该信息用于绑定。当使用 IColumnsInfo 获取列信息以用于绑定目的时,如果 SSPROP_ALLOWNATIVEVARIANT 会话属性为 FALSE(默认值),则为 sql_variant 列返回 DBTYPE_VARIANT。如果 SSPROP_ALLOWNATIVEVARIANT 属性为 FALSE,则不支持 DBTYPE_SQLVARIANT。如果 SSPROP_ALLOWNATIVEVARIANT 属性设置为 TRUE,列类型将作为 DBTYPE_SQLVARIANT 返回,在这种情况下,缓冲区将保留 SSVARIANT 结构。在提取 sql_variant 数据作为 DBTYPE_SQLVARIANT 时,必须将 SSPROP_ALLOWNATIVEVARIANT 会话属性设置为 TRUE。
SSPROP_ALLOWNATIVEVARIANT 属性是特定于访问接口的 DBPROPSET_SQLSERVERSESSION 属性集的一部分,因此,该属性是一个会话属性。
DBTYPE_VARIANT 适用于所有其他 OLE DB 访问接口。
SSPROP_ALLOWNATIVEVARIANT
SSPROP_ALLOWNATIVEVARIANT 是一个会话属性,并且是 DBPROPSET_SQLSERVERSESSION 属性集的一部分。
SSPROP_ALLOWNATIVEVARIANT |
类型:VT_BOOL R/W:读/写 默认值:VARIANT_FALSE 说明:确定提取的数据是作为 DBTYPE_VARIANT 还是作为 DBTYPE_SQLVARIANT。 VARIANT_TRUE:列类型作为 DBTYPE_SQLVARIANT 返回,这种情况下缓冲区将保留 SSVARIANT 结构。 VARIANT_FALSE:列类型作为 DBTYPE_VARIANT 返回,且缓冲区将具有 VARIANT 结构。 |