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

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

有关 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 2000

varbinary

image

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 返回的列元数据(目录元数据)”中所述。