行集和参数中的数据类型映射

在行集中,SQL Server Native Client OLE DB 访问接口通过使用在 IColumnsInfo::GetColumnInfoICommandWithParameters::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 结构。

请参阅

概念