次の方法で共有


大きな CLR ユーザー定義型 (OLE DB)

このトピックでは、大きな共通言語ランタイム (CLR) ユーザー定義型 (UDT) をサポートするための、SQL Server Native Client の OLE DB に対する変更について説明します。

SQL Server Native Client における大きな CLR UDT のサポートの詳細については、「大きな CLR ユーザー定義型」を参照してください。

データ形式

SQL Server Native Client では、大きなオブジェクト (LOB) の型についてサイズが無制限である値の長さを表す場合に、~0 が使用されます。SQL Server 2008 以降は、8,000 バイトを超える CLR UDT のサイズも ~0 で表されるようになりました。

次の表に、パラメータおよび行セットでのデータ型のマッピングを示します。

SQL Server データ型

OLE DB データ型

メモリ レイアウト

CLR UDT

DBTYPE_UDT

BYTE[] (バイト配列)

132 (oledb.h)

UDT 値はバイト配列として表されます。16 進文字列との間の変換がサポートされています。リテラル値は、"0x" で始まる 16 進文字列として表されます。16 進文字列は、ベース 16 のバイナリ データをテキストで表現したものです。一例として、サーバー型 varbinary(10) から DBTYPE_STR への変換が挙げられます。この変換では、1 対の文字が 1 バイトを表す 20 文字の 16 進表記が生成されます。

パラメータのプロパティ

DBPROPSET_SQLSERVERPARAMETER プロパティ セットは、OLE DB を介して UDT をサポートします。詳細については、「ユーザー定義型の使用」を参照してください。

列のプロパティ

DBPROPSET_SQLSERVERCOLUMN プロパティ セットは、OLE DB を介してテーブルの作成をサポートします。詳細については、「ユーザー定義型の使用」を参照してください。

ITableDefinition::CreateTable でのデータ型マッピング

UDT 列が必要な場合は、ITableDefinition::CreateTable で使用される DBCOLUMNDESC 構造体で、以下の情報が使用されます。

OLE DB データ型 (wType)

pwszTypeName

SQL Server データ型

rgPropertySets

DBTYPE_UDT

無視

UDT

DBPROPSET_SQLSERVERCOLUMN プロパティ セットを含める必要があります。

ICommandWithParameters::GetParameterInfo

prgParamInfo を介して DBPARAMINFO 構造体に返される情報は、次のとおりです。

パラメータの型

wType

ulParamSize

bPrecision

bScale

dwFlags DBPARAMFLAGS_ISLONG

DBTYPE_UDT

(8,000 バイト以下の長さ)

"DBTYPE_UDT"

n

未定義

未定義

クリア

DBTYPE_UDT

(8,000 バイトを超える長さ)

"DBTYPE_UDT"

~0

未定義

未定義

設定

ICommandWithParameters::SetParameterInfo

DBPARAMBINDINFO 構造体で提供される情報は、次の表に準拠する必要があります。

パラメータの型

pwszDataSourceType

ulParamSize

bPrecision

bScale

dwFlags DBPARAMFLAGS_ISLONG

DBTYPE_UDT

(8,000 バイト以下の長さ)

DBTYPE_UDT

n

無視

無視

パラメータが DBTYPE_IUNKNOWN を使用して渡される場合に設定する必要があります。

DBTYPE_UDT

(8,000 バイトを超える長さ)

DBTYPE_UDT

~0

無視

無視

無視

ISSCommandWithParameters

アプリケーションでは、ISSCommandWithParameters を使用して、「パラメータのプロパティ」セクションで定義されているパラメータのプロパティを取得または設定します。

IColumnsRowset::GetColumnsRowset

返される列は次のとおりです。

列の型

DBCOLUMN_TYPE

DBCOLUMN_COLUMNSIZE

DBCOLUMN_PRECISION

DBCOLUMN_SCALE

DBCOLUMN_FLAGS_ISLONG

DBCOLUMNS_ISSEARCHABLE

DBCOLUMN_OCTETLENGTH

DBTYPE_UDT

(8,000 バイト以下の長さ)

DBTYPE_UDT

n

NULL

NULL

クリア

DB_ALL_EXCEPT_LIKE

n

DBTYPE_UDT

(8,000 バイトを超える長さ)

DBTYPE_UDT

~0

NULL

NULL

設定

DB_ALL_EXCEPT_LIKE

0

UDT には次の列も定義されています。

列識別子

説明

DBCOLUMN_UDT_CATALOGNAME

DBTYPE_WSTR

UDT 列の場合は、UDT が定義されているカタログの名前。

DBCOLUMN_UDT_SCHEMANAME

DBTYPE_WSTR

UDT 列の場合は、UDT が定義されているスキーマの名前。

DBCOLUMN_UDT_NAME

DBTYPE_WSTR

UDT 列の場合は、UDT の 1 部構成の名前。

DBCOLUMN_ASSEMBLY_TYPENAME

DBTYPE_WSTR

UDT 列の場合は、UDT の完全な型名。アセンブリ型の完全修飾名を使用することで、Type.GetType メソッドを使用してその型のオブジェクトのインスタンスを作成できます。

IColumnsInfo::GetColumnInfo

DBCOLUMNINFO 構造体で返される情報は次のとおりです。

パラメータの型

wType

ulColumnSize

bPrecision

bScale

dwFlags

DBCOLUMNFLAGS_ISLONG

DBTYPE_UDT

(8,000 バイト以下の長さ)

DBTYPE_UDT

n

~0

~0

クリア

DBTYPE_UDT

(8,000 バイトを超える長さ)

DBTYPE_UDT

~0

~0

~0

設定

COLUMNS 行セット (スキーマ行セット)

UDT 型に対して返される列値を次に示します。

列の型

DATA_TYPE

COLUMN_FLAGS、DBCOLUMFLAGS_ISLONG

CHARACTER_OCTET_LENGTH

DBTYPE_UDT

(8,000 バイト以下の長さ)

DBTYPE_UDT

クリア

n

DBTYPE_UDT

(8,000 バイトを超える長さ)

DBTYPE_UDT

設定

0

UDT には、次の追加の列が定義されています。

列識別子

説明

SS_UDT_CATALOGNAME

DBTYPE_WSTR

UDT 列の場合は、UDT が定義されているカタログの名前。

SS_UDT_SCHEMANAME

DBTYPE_WSTR

UDT 列の場合は、UDT が定義されているスキーマの名前。

SS_UDT_NAME

DBTYPE_WSTR

UDT 列の場合は、UDT の 1 部構成の名前。

SS_ASSEMBLY_TYPENAME

DBTYPE_WSTR

UDT 列の場合は、UDT の完全な型名。アセンブリ型の完全修飾名を使用することで、Type.GetType メソッドを使用してその型のオブジェクトのインスタンスを作成できます。

PROCEDURE_PARAMETERS 行セットに関しては、DATA_TYPE に COLUMNS スキーマ行セットと同じ値が格納され、TYPE_NAME に UDT が格納されます。同じ追加の列も定義されています。

PROVIDER_TYPES スキーマ行セットには、ユーザー定義型が表示されません。

バインドと変換

Binding データ型

UDT からサーバー

UDT 以外からサーバー

サーバーから UDT

サーバーから UDT 以外

DBTYPE_UDT

サポート (5)

エラー (1)

サポート (5)

エラー (4)

DBTYPE_BYTES

サポート (5)

N/A

サポート (5)

N/A

DBTYPE_WSTR

サポート (2)、(5)

N/A

サポート (3)、(5)、(6)

N/A

DBTYPE_BSTR

サポート (2)、(5)

N/A

サポート (3)、(5)

N/A

DBTYPE_STR

サポート (2)、(5)

N/A

サポート (3)、(5)

N/A

DBTYPE_IUNKNOWN

サポート (6)

N/A

サポート (6)

N/A

DBTYPE_VARIANT (VT_UI1 | VT_ARRAY)

サポート (5)

N/A

サポート (3)、(5)

N/A

DBTYPE_VARIANT (VT_BSTR)

サポート (2)、(5)

N/A

N/A

N/A

記号の説明

記号

意味

1

ICommandWithParameters::SetParameterInfo メソッドで DBTYPE_UDT 以外のサーバーの型が指定され、アクセサの型が DBTYPE_UDT の場合は、ステートメントの実行時にエラーが発生します。発生するエラーは DB_E_ERRORSOCCURRED、パラメータの状態は DBSTATUS_E_BADACCESSOR です。

UDT ではないサーバー パラメータに UDT 型のパラメータを指定すると、エラーになります。

2

データが 16 進数文字列からバイナリ データに変換されます。

3

データがバイナリ データから 16 進文字列に変換されます。

4

CreateAccessor または GetNextRows を使用したときに、検証が行われる場合があります。このエラーは DB_E_ERRORSOCCURRED です。バインドの状態は、DBBINDSTATUS_UNSUPPORTEDCONVERSION に設定されます。

5

BY_REF を使用できます。

6

UDT パラメータを、DBBINDING で DBTYPE_IUNKNOWN としてバインドできます。DBTYPE_IUNKNOWN へのバインドは、アプリケーションで ISequentialStream インターフェイスを使用してデータをストリームとして処理する必要があることを示します。コンシューマがバインド内の wType を DBTYPE_IUNKNOWN 型として指定した場合に、ストアド プロシージャの対応する列または出力パラメータが UDT であると、SQL Server Native Client から ISequentialStream が返されます。入力パラメータについては、SQL Server Native Client が ISequentialStream インターフェイスを照会します。

UDT が大きい場合は、DBTYPE_IUNKNOWN バインドを使用しながら UDT データの長さをバインドしないようにすることができます。ただし、小さな UDT の場合は長さをバインドする必要があります。次の条件が 1 つ以上当てはまる場合は、DBTYPE_UDT パラメータを大きな UDT として指定できます。

  • ulParamParamSize が ~0 である。

  • DBPARAMBINDINFO 構造体で DBPARAMFLAGS_ISLONG が設定されている。

行データの場合は、DBTYPE_IUNKNOWN バインドを大きな UDT だけに使用できます。列が大きな UDT 型かどうかを確認するには、Rowset または Command オブジェクトの IColumnsInfo インターフェイスで、IColumnsInfo::GetColumnInfo メソッドを使用します。次の条件が 1 つ以上当てはまる場合、DBTYPE_UDT 列は大きな UDT 列です。

  • DBCOLUMNINFO 構造体の dwFlags メンバで、DBCOLUMNFLAGS_ISLONG フラグが設定されている。

  • DBCOLUMNINFO の ulColumnSize メンバが ~0 である。

DBTYPE_NULL と DBTYPE_EMPTY は入力パラメータにバインドできますが、出力パラメータや結果にはバインドできません。入力パラメータにバインドした場合は、状態を DBSTATUS_S_ISNULL (DBTYPE_NULL の場合) または DBSTATUS_S_DEFAULT (DBTYPE_EMPTY の場合) に設定する必要があります。DBTYPE_BYREF を、DBTYPE_NULL または DBTYPE_EMPTY と共に使用することはできません。

DBTYPE_UDT は、DBTYPE_EMPTY および DBTYPE_NULL に変換することもできます。ただし、DBTYPE_NULL および DBTYPE_EMPTY を DBTYPE_UDT に変換することはできません。この動作は、DBTYPE_BYTES 型と一貫性があります。UDT をパラメータとして処理する場合には、ISSCommandWithParameters が使用されます。

OLE DB Core Services で提供されるデータ変換 (IDataConvert) は、DBTYPE_UDT 型には適用できません。

その他のバインドはサポートされません。

IRowsetFind での比較

UDT 型については、次の比較のみがサポートされています。

  • EQ

  • NE

  • IGNORE

その他の比較を試みると、DB_E_BADCOMPAREOP が返されます。

BCP による UDT のサポート

UDT 値は、文字またはバイナリ値としてのみインポートおよびエクスポートできます。

UDT に対する下位クライアントの動作

UDT に対しては、下位クライアントで次のように型マッピングが行われます。

クライアントのバージョン

DBTYPE_UDT

(8,000 バイト以下の長さ)

DBTYPE_UDT

(8,000 バイトを超える長さ)

SQL Server 2000 以前

varbinary

image

SQL Server 2005

UDT

varbinary(max)

SQL Server 2008

UDT

UDT

DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) を "80" に設定すると、大きな UDT 型が、下位クライアントで表示されるときと同じようにクライアントで表示されます。