大きな CLR ユーザー定義型 (ODBC)
このトピックでは、大きな共通言語ランタイム (CLR) ユーザー定義型 (UDT) をサポートするための、SQL Server Native Client の ODBC に対する変更について説明します。
SQL Server Native Client における大きな CLR UDT のサポートの詳細については、「大きな CLR ユーザー定義型」を参照してください。
データ形式
SQL Server Native Client では、大きなオブジェクト (LOB) の型について、列のサイズが 8,000 バイトを超えていることを示す場合に、SQL_SS_LENGTH_UNLIMITED が使用されます。SQL Server 2008 以降では、サイズが 8,000 バイトを超えている CLR UDT にも同じ値が使用されるようになりました。
UDT 値はバイト配列として表されます。16 進文字列との間の変換がサポートされています。リテラル値は、"0x" で始まる 16 進文字列として表されます。
次の表に、パラメータおよび結果セットでのデータ型のマッピングを示します。
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 (8,000 バイトを超える長さ) |
---|---|---|
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 パラメータには、SQLSetDescField によって必ず SQL_CA_SS_UDT_TYPE_NAME を設定する必要があります。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 (8,000 バイトを超える長さ) |
---|---|---|
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 (8,000 バイトを超える長さ) |
---|---|---|
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 の完全修飾名 |
最後の 3 つの列はドライバ固有の列です。これらの列は、ODBC で定義された列の後で、SQLColumns または SQLProcedureColumns の結果セットに既にあるドライバ固有の列の前に追加されます。
個々の UDT またはジェネリック型 "udt" に対しては、SQLGetTypeInfo から行が返されません。
バインドと変換
SQL から C データ型への変換としてサポートされているものは次のとおりです。
変換対象 |
SQL_SS_UDT |
---|---|
SQL_C_WCHAR |
サポート * |
SQL_C_BINARY |
サポート |
SQL_C_CHAR |
サポート * |
* バイナリ データが 16 進文字列に変換されます。
C から SQL データ型への変換としてサポートされているものは次のとおりです。
変換対象 |
SQL_SS_UDT |
---|---|
SQL_C_WCHAR |
サポート * |
SQL_C_BINARY |
サポート |
SQL_C_CHAR |
サポート * |
* 16 進文字列からバイナリ データへの変換が行われます。
SQL_VARIANT による UDT のサポート
SQL_VARIANT 列では UDT がサポートされません。
BCP による UDT のサポート
UDT 値は、文字またはバイナリ値としてのみインポートおよびエクスポートできます。
UDT に対する下位クライアントの動作
UDT に対しては、下位クライアントで次のように型マッピングが行われます。
サーバーのバージョン |
SQL_SS_UDT (8,000 バイト以下の長さ) |
SQL_SS_UDT (8,000 バイトを超える長さ) |
---|---|---|
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 (8,000 バイトを超える長さ) |
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 (8,000 バイトを超える長さ) |
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 (8,000 バイトを超える長さ) |
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 (8,000 バイトを超える長さ) |
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 (8,000 バイトを超える長さ) |
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 から返される列のメタデータ (カタログ メタデータ)」で説明したとおりです。