大型 CLR 用户定义类型 (ODBC)

本主题讨论 SQL Server Native Client 中为支持大型公共语言运行时 (CLR) 用户定义类型 (UDT) 而对 ODBC 进行的更改。

要查看显示针对大型 CLR UDT 的 ODB 支持的示例,请参阅支持大型 UDT

有关 SQL Server Native Client 中对大型 CLR UDT 的支持的详细信息,请参阅大型 CLR 用户定义类型

数据格式

SQL Server Native Client 使用 SQL_SS_LENGTH_UNLIMITED 来指示大型对象 (LOB) 类型的列大小大于 8,000 个字节。 从 SQL Server 2008 开始,在其大小大于 8,000 个字节时将相同的值用于 CLR UDT。

UDT 值表示为字节数组。 支持与十六进制字符串之间的转换。 文字值表示为带有“0x”前缀的十六进制字符串。

下表显示了参数和结果集中的数据类型映射:

SQL Server 数据类型

SQL 数据类型

CLR UDT

SQL_SS_UDT

-151 (sqlncli.h)

下表介绍相应的结构和 ODBC C 类型。 本质上,CLR UDT 是具有其他元数据的 varbinary 类型。

SQL 数据类型

内存布局

C 数据类型

值 (sqlext.h)

SQL_SS_UDT

SQLCHAR *(unsigned char *)

SQL_C_BINARY

SQL_BINARY (-2)

参数的描述符字段

IPD 字段中返回的信息如下所示:

描述符字段

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

(长度大于 8000 个字节)

SQL_DESC_CASE_SENSITIVE

SQL_FALSE

SQL_FALSE

SQL_DESC_CONCISE_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_DATETIME_INTERVAL_CODE

0

0

SQL_DESC_DATETIME_INTERVAL_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_FIXED_PREC_SCALE

SQL_FALSE

SQL_FALSE

SQL_DESC_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_LOCAL_TYPE_NAME

"udt"

"udt"

SQL_DESC_OCTET_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_SCALE

0

0

SQL_DESC_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_TYPE_NAME

"udt"

"udt"

SQL_DESC_UNSIGNED

SQL_TRUE

SQL_TRUE

SQL_CA_SS_UDT_CATALOG_NAME

包含 UDT 的目录的名称。

包含 UDT 的目录的名称。

SQL_CA_SS_UDT_SCHEMA_NAME

包含 UDT 的架构的名称。

包含 UDT 的架构的名称。

SQL_CA_SS_UDT_TYPE_NAME

UDT 的名称。

UDT 的名称。

SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME

UDT 的完全限定名称。

UDT 的完全限定名称。

对于 UDT 参数,SQL_CA_SS_UDT_TYPE_NAME 必须始终通过 SQLSetDescField 来设置。 SQL_CA_SS_UDT_CATALOG_NAME 和 SQL_CA_SS_UDT_SCHEMA_NAME 是可选的。

如果使用与表不同的架构在同一数据库中定义 UDT,则必须设置 SQL_CA_SS_UDT_SCHEMA_NAME。

如果在与表不同的数据库中定义 UDT,则必须设置 SQL_CA_SS_UDT_CATALOG_NAME 和 SQL_CA_SS_UDT_SCHEMA_NAME。

如果在 SQL_CA_SS_UDT_TYPE_NAME、SQL_CA_SS_UDT_CATALOG_NAME 或 SQL_CA_SS_UDT_SCHEMA_NAME 的设置中存在错误或遗漏,则生成具有 SQLSTATE HY000 和服务器特定消息文本的诊断记录。

结果的描述符字段

IRD 字段中返回的信息如下所示:

描述符字段

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

(长度大于 8000 个字节)

SQL_DESC_AUTO_UNIQUE_VALUE

SQL_FALSE

SQL_FALSE

SQL_DESC_CASE_SENSITIVE

SQL_FALSE

SQL_FALSE

SQL_DESC_CONCISE_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_DATETIME_INTERVAL_CODE

0

0

SQL_DESC_DATETIME_INTERVAL_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_DISPLAY_SIZE

2n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_FIXED_PREC_SCALE

SQL_FALSE

SQL_FALSE

SQL_DESC_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_LITERAL_PREFIX

"0x"

"0x"

SQL_DESC_LITERAL_SUFFIX

""

""

SQL_DESC_LOCAL_TYPE_NAME

"udt"

"udt"

SQL_DESC_OCTET_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_SCALE

0

0

SQL_DESC_SEARCHABLE

SQL_PRED_NONE

SQL_PRED_NONE

SQL_DESC_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_TYPE_NAME

"udt"

"udt"

SQL_DESC_UNSIGNED

SQL_TRUE

SQL_TRUE

SQL_CA_SS_UDT_CATALOG_NAME

包含 UDT 的目录的名称。

包含 UDT 的目录的名称。

SQL_CA_SS_UDT_SCHEMA_NAME

包含 UDT 的架构的名称。

包含 UDT 的架构的名称。

SQL_CA_SS_UDT_TYPE_NAME

UDT 的名称。

UDT 的名称。

SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME

UDT 的完全限定名称。

UDT 的完全限定名称。

SQLColumns 和 SQLProcedureColumns 返回的列元数据(目录元数据)

为 UDT 返回以下列值:

列名

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

(长度大于 8000 个字节)

DATA_TYPE

SQL_SS_UDT

SQL_SS_UDT

TYPE_NAME

UDT 的名称。

UDT 的名称。

COLUMN_SIZE

n

SQL_SS_LENGTH_UNLIMITED (0)

BUFFER_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

DECIMAL_DIGITS

NULL

NULL

SQL_DATA_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DATETIME_SUB

NULL

NULL

CHAR_OCTET_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SS_UDT_CATALOG_NAME

包含 UDT 的目录的名称。

包含 UDT 的目录的名称。

SS_UDT_SCHEMA_NAME

包含 UDT 的架构的名称。

包含 UDT 的架构的名称。

SS_UDT_ASSEMBLY_TYPE_NAME

UDT 的完全限定名称。

UDT 的完全限定名称。

最后三列是驱动程序特定的列。 在任意 ODBC 定义的列之后、但在 SQLColumnsSQLProcedureColumns 的结果集的任意现有驱动程序特定列之前添加它们。

对于各个 UDT 或一般类型“udt”,SQLGetTypeInfo 不返回任何行。

绑定和转换

支持的从 SQL 到 C 数据类型的转换如下所示:

转换的目标和源:

SQL_SS_UDT

SQL_C_WCHAR

支持*

SQL_C_BINARY

支持

SQL_C_CHAR

支持*

*将二进制数据转换为十六进制字符串。

支持的从 C 到 SQL 数据类型的转换如下所示:

转换的目标和源:

SQL_SS_UDT

SQL_C_WCHAR

支持*

SQL_C_BINARY

支持

SQL_C_CHAR

支持*

*将十六进制字符串转换为二进制数据。

对 UDT 的 SQL_VARIANT 支持

在 SQL_VARIANT 列中不支持 UDT。

对 UDT 的 BCP 支持

UDT 值只能作为字符值或二进制值导入和导出。

UDT 的下级客户端行为

对于下级客户端,UDT 会进行类型映射,如下所示:

服务器版本

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

(长度大于 8000 个字节)

SQL Server 2005

UDT

varbinary(max)

SQL Server 2008 和更高版本

UDT

UDT

支持大型 CLR UDT 的 ODBC 函数

本节讨论为支持大型 CLR UDT 而对 SQL Server Native Client ODBC 函数进行的更改。

SQLBindCol

按本主题前面的章节“绑定和转换”中所述,将 UDT 结果列值从 SQL 数据类型转换为 C 数据类型。

SQLBindParameter

UDT 所需的值如下所示:

SQL 数据类型

Parametertype

ColumnSizePtr

DecimalDigitsPtr

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

n

0

SQL_SS_UDT

(长度大于 8000 个字节)

SQL_SS_UDT

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLColAttribute

为 UDT 返回的值如本主题前面的章节“结果的描述符字段”中所述。

SQLColumns

为 UDT 返回的值如本主题前面的章节“SQLColumns 和 SQLProcedureColumns 返回的列元数据(目录元数据)”中所述。

SQLDescribeCol

为 UDT 返回的值如下所示:

SQL 数据类型

DataTypePtr

ColumnSizePtr

DecimalDigitsPtr

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

n

0

SQL_SS_UDT

(长度大于 8000 个字节)

SQL_SS_UDT

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLDescribeParam

为 UDT 返回的值如下所示:

SQL 数据类型

DataTypePtr

ColumnSizePtr

DecimalDigitsPtr

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

n

0

SQL_SS_UDT

(长度大于 8000 个字节)

SQL_SS_UDT

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLFetch

按本主题前面的章节“绑定和转换”中所述,将 UDT 结果列值从 SQL 数据类型转换为 C 数据类型。

SQLFetchScroll

按本主题前面的章节“绑定和转换”中所述,将 UDT 结果列值从 SQL 数据类型转换为 C 数据类型。

SQLGetData

按本主题前面的章节“绑定和转换”中所述,将 UDT 结果列值从 SQL 数据类型转换为 C 数据类型。

SQLGetDescField

新类型可用的描述符字段如本主题前面的章节“参数的描述符字段”和“结果的描述符字段”中所述。

SQLGetDescRec

为 UDT 返回的值如下所示:

SQL 数据类型

类型

子类型

长度

精度

小数位数

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

0

n

n

0

SQL_SS_UDT

(长度大于 8000 个字节)

SQL_SS_UDT

0

SQL_SS_LENGTH_UNLIMITED (0)

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLGetTypeInfo

为 UDT 返回的值如本主题前面的章节“SQLColumns 和 SQLProcedureColumns 返回的列元数据(目录元数据)”中所述。

SQLProcedureColumns

为 UDT 返回的值如本主题前面的章节“SQLColumns 和 SQLProcedureColumns 返回的列元数据(目录元数据)”中所述。

SQLPutData

按本主题前面的章节“绑定和转换”中所述,将 UDT 参数值从 C 数据类型转换为 SQL 数据类型。

SQLSetDescField

新类型可用的描述符字段如本主题前面的章节“参数的描述符字段”和“结果的描述符字段”中所述。

SQLSetDescRec

UDT 允许的值如下所示:

SQL 数据类型

类型

子类型

长度

精度

小数位数

SQL_SS_UDT

(长度小于或等于 8,000 个字节)

SQL_SS_UDT

0

n

n

0

SQL_SS_UDT

(长度大于 8000 个字节)

SQL_SS_UDT

0

SQL_SS_LENGTH_UNLIMITED (0)

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLSpecialColumns

为列 DATA_TYPE、TYPE_NAME、COLUMN_SIZE、BUFFER_LENGTH 和 DECIMAL_DIGTS UDT 返回的值如本主题前面的章节“SQLColumns 和 SQLProcedureColumns 返回的列元数据(目录元数据)”中所述。

请参阅

概念

大型 CLR 用户定义类型