大型 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 定义的列之后、但在 SQLColumns 或 SQLProcedureColumns 的结果集的任意现有驱动程序特定列之前添加它们。
对于各个 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 返回的列元数据(目录元数据)”中所述。