次の方法で共有


以前のバージョンの SQL Server における、新しい日付または時刻の機能の動作 (OLE DB)

このトピックでは、強化された日付と時刻の機能を使用するクライアント アプリケーションが SQL Server 2008 より前のバージョンの SQL Server と通信する場合、および SQL Server 2008 より前のバージョンの SQL Server Native Client でコンパイルされたクライアントから、機能強化された日付と時刻をサポートするサーバーへコマンドを送信する場合に想定される動作について説明します。

下位クライアントの動作

SQL Server 2008 より前のバージョンの SQL Server Native Client を使用するクライアント アプリケーションでは、新しい日付型または時刻型が nvarchar 列と見なされます。 列のコンテンツはリテラル表現になります。 詳細については、「OLE DB の日付/時刻の強化に対するデータ型のサポート」の「データ形式 : 文字列とリテラル」を参照してください。列のサイズは、列に指定された有効桁数に対するリテラルの最大長です。

カタログ API によって、クライアントに返される下位データ型のコード (nvarchar など) および関連する下位の表現 (適切なリテラル形式など) と一貫性のあるメタデータが返されます。 ただし、返されるデータ型名は、実際の SQL Server 2008 の型名です。

日付型または時刻型へのスキーマ変更が加えられた SQL Server 2008 以降のサーバーに対して下位クライアント アプリケーションが実行された場合に、予想される動作は次のとおりです。

OLE DB クライアントの型

SQL Server 2005 の型

SQL Server 2008 以降の型

結果の変換 (サーバーからクライアントへ)

パラメーターの変換 (クライアントからサーバーへ)

DBTYPE_DBDATE

Datetime

日付

OK

OK

DBTYPE_DBTIMESTAMP

時刻フィールドは 0 に設定されます。

時刻フィールドが 0 以外の場合、文字列の切り捨てにより IRowsetChange は失敗します。

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

日付フィールドは現在の日付に設定されます。

秒の小数部が 0 以外の場合、文字列の切り捨てにより IRowsetChange は失敗します。

日付は無視されます。

DBTYPE_DBTIME

Time(7)

失敗します (時刻リテラルが無効です)。

OK

DBTYPE_DBTIMESTAMP

失敗します (時刻リテラルが無効です)。

OK

DBTYPE_DBTIMESTAMP

Datetime2(3)

OK

OK

DBTYPE_DBTIMESTAMP

Datetime2(7)

OK

OK

DBTYPE_DBDATE

Smalldatetime

日付

OK

OK

DBTYPE_DBTIMESTAMP

時刻フィールドは 0 に設定されます。

時刻フィールドが 0 以外の場合、文字列の切り捨てにより IRowsetChange は失敗します。

DBTYPE_DBTIME

Time(0)

OK

OK

DBTYPE_DBTIMESTAMP

日付フィールドは現在の日付に設定されます。

秒の小数部が 0 以外の場合、文字列の切り捨てにより IRowsetChange は失敗します。

日付は無視されます。

DBTYPE_DBTIMESTAMP

Datetime2(0)

OK

OK

OK は、SQL Server 2005 で機能した場合には、SQL Server 2008 以降でも引き続き機能することを意味します。

次の一般的なスキーマ変更のみが考慮されています。

  • 論理的にアプリケーションで日付値または時刻値のみが必要な場合に、新しい型を使用します。 ただし、個別の日付型および時刻型がないため、アプリケーションでは datetime または smalldatetime の使用が強制されました。

  • 追加の秒の小数部の有効桁数または精度を取得するために、新しい型を使用します。

  • 日付と時刻に推奨されるデータ型なので datetime2 に切り替えます。

クライアントでの変換中、変換元の型の文字列形式が変換先の型の文字列形式よりも大きい場合、アプリケーションが ICommandWithParameters::GetParameterInfo またはスキーマ行セットから取得したサーバー メタデータを使用して、ICommandWithParameters::SetParameterInfo を使用してパラメーターの型情報を設定すると、失敗します。 たとえば、クライアントのバインドで DBTYPE_DBTIMESTAMP を使用し、サーバーの列が date 型の場合、SQL Server Native Client では、値が "yyyy-dd-mm hh:mm:ss.fff" に変換されますが、サーバー メタデータは nvarchar(10) として返されます。 その結果発生するオーバーフローが、DBSTATUS_E_CATCONVERTVALUE の原因となります。 IRowsetChange によるデータ変換でも同様の問題が発生します。これは、行セットのメタデータが結果セットのメタデータから設定されるためです。

パラメーターと行セットのメタデータ

ここでは、SQL Server 2008 より前のバージョンの SQL Server Native Client でコンパイルされたクライアントのパラメーター、結果列、およびスキーマ行セットのメタデータについて説明します。

ICommandWithParameters::GetParameterInfo

DBPARAMINFO 構造体では、prgParamInfo パラメーターを使用して次の情報が返されます。

パラメーターの型

wType

ulParamSize

bPrecision

bScale

date

DBTYPE_WSTR

10

~0

~0

time

DBTYPE_WSTR

8, 10..16

~0

~0

smalldatetime

DBTYPE_DBTIMESTAMP

16

16

0

datetime

DBTYPE_DBTIMESTAMP

16

23

3

datetime2

DBTYPE_WSTR

19,21..27

~0

~0

datetimeoffset

DBTYPE_WSTR

26,28..34

~0

~0

上記の値の範囲は連続していない場合があることに注意してください。たとえば、"8,10..16" には 9 は含まれません。 有効桁数が 0 より大きい場合は、小数点が追加されるためです。

IColumnsRowset::GetColumnsRowset

返される列を次に示します。

列の型

DBCOLUMN_TYPE

DBCOLUMN_COLUMNSIZE

DBCOLUMN_PRECISION

DBCOLUMN_SCALE、DBCOLUMN_DATETIMEPRECISION

date

DBTYPE_WSTR

10

NULL

NULL

time

DBTYPE_WSTR

8, 10..16

NULL

NULL

smalldatetime

DBTYPE_DBTIMESTAMP

16

16

0

datetime

DBTYPE_DBTIMESTAMP

16

23

3

datetime2

DBTYPE_WSTR

19,21..27

NULL

NULL

datetimeoffset

DBTYPE_WSTR

26,28..34

NULL

NULL

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO 構造体から次の情報が返されます。

パラメーターの型

wType

ulColumnSize

bPrecision

bScale

date

DBTYPE_WSTR

10

~0

~0

time(1..7)

DBTYPE_WSTR

8, 10..16

~0

~0

smalldatetime

DBTYPE_DBTIMESTAMP

16

16

0

datetime

DBTYPE_DBTIMESTAMP

16

23

3

datetime2

DBTYPE_WSTR

19,21..27

~0

~0

datetimeoffset

DBTYPE_WSTR

26,28..34

~0

~0

スキーマ行セット

このセクションでは、新しいデータ型のパラメーター、結果列、およびスキーマ行セットのメタデータについて説明します。 この情報は、SQL Server 2008 SQL Server Native Client より前のツールを使用して開発されたクライアント プロバイダーを使用する場合に役立ちます。

COLUMNS 行セット

日付型または時刻型に対して返される列の値を次に示します。

列の型

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

DATETIME_PRECISION

date

DBTYPE_WSTR

10

20

NULL

time

DBTYPE_WSTR

8, 10..16

16,20..32

NULL

smalldatetime

DBTYPE_DBTIMESTAMP

NULL

NULL

0

datetime

DBTYPE_DBTIMESTAMP

NULL

NULL

3

datetime2

DBTYPE_WSTR

19,21..27

38,42..54

NULL

datetimeoffset

DBTYPE_WSTR

26,28..34

52, 56..68

NULL

PROCEDURE_PARAMETERS 行セット

日付型または時刻型に対して返される列の値を次に示します。

列の型

DATA_TYPE

CHARACTER_MAXIMUM_LENGTH

CHARACTER_OCTET_LENGTH

TYPE_NAME

LOCAL_TYPE_NAME

date

DBTYPE_WSTR

10

20

date

time

DBTYPE_WSTR

8, 10..16

16,20..32

time

smalldatetime

DBTYPE_DBTIMESTAMP

NULL

NULL

smalldatetime

datetime

DBTYPE_DBTIMESTAMP

NULL

NULL

datetime

datetime2

DBTYPE_WSTR

19,21..27

38,42..54

datetime2

datetimeoffset

DBTYPE_WSTR

26,28..34

52, 56..68

datetimeoffset

PROVIDER_TYPES 行セット

日付/時刻型に対して返される行を次に示します。

型 ->

date

time

smalldatetime

datetime

datetime2

datetimeoffset

TYPE_NAME

date

time

smalldatetime

datetime

datetime2

datetimeoffset

DATA_TYPE

DBTYPE_WSTR

DBTYPE_WSTR

DBTYPE_DBTIMESTAMP

DBTYPE_DBTIMESTAMP

DBTYPE_WSTR

DBTYPE_WSTR

COLUMN_SIZE

10

16

16

23

27

34

LITERAL_PREFIX

LITERAL_SUFFIX

CREATE_PARAMS

NULL

NULL

NULL

NULL

NULL

NULL

IS_NULLABLE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

VARIANT_TRUE

CASE_SENSITIVE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

DB_SEARCHABLE

UNSIGNED_ATTRIBUTE

NULL

NULL

NULL

NULL

NULL

NULL

FIXED_PREC_SCALE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

AUTO_UNIQUE_VALUE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

LOCAL_TYPE_NAME

date

time

smalldatetime

datetime

datetime2

datetimeoffset

MINIMUM_SCALE

NULL

NULL

NULL

NULL

NULL

NULL

MAXIMUM_SCALE

NULL

NULL

NULL

NULL

NULL

NULL

GUID

NULL

NULL

NULL

NULL

NULL

NULL

TYPELIB

NULL

NULL

NULL

NULL

NULL

NULL

VERSION

NULL

NULL

NULL

NULL

NULL

NULL

IS_LONG

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

BEST_MATCH

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_TRUE

VARIANT_FALSE

VARIANT_FALSE

IS_FIXEDLENGTH

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

VARIANT_FALSE

下位サーバーの動作

SQL Server 2008 より前のバージョンのサーバーに接続している場合、(たとえば、ICommandWithParameters::SetParameterInfo または ITableDefinition::CreateTable で) 新しいサーバーの型名の使用を試みると、DB_E_BADTYPENAME になります。

型名を使用せずに新しい型がパラメーターまたは結果にバインドされている場合に、新しい型を使用してサーバーの型を暗黙的に指定するか、サーバーの型からクライアントの型への有効な変換がないと、DB_E_ERRORSOCCURRED が返されます。また、実行時に使用されるアクセサーのバインドの状態に DBBINDSTATUS_UNSUPPORTED_CONVERSION が設定されます。

接続時に、サーバーのバージョンに対して、クライアントでのバッファーの型からサーバーの型への変換がサポートされている場合は、クライアントのすべてのバッファーの型を使用できます。 ここでは、サーバーの型は、ICommandWithParameters::SetParameterInfo によって指定される型か、ICommandWithParameters::SetParameterInfo が呼び出されていない場合にバッファーの型によって暗黙的に示される型を意味します。 つまり、クライアントでサポートされるサーバーの型への変換が成功した場合、DBTYPE_DBTIME2 および DBTYPE_DBTIMESTAMPOFFSET は、下位サーバーで使用するか、DataTypeCompatibility=80 の場合に使用することができます。 当然ながら、サーバーの型が正しくないと、実際のサーバーの型への暗黙的な変換を実行できない場合にサーバーからエラーが報告されます。

SSPROP_INIT_DATATYPECOMPATIBILITY の動作

SSPROP_INIT_DATATYPECOMPATIBILITY が SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 に設定されている場合、「機能強化された日付型と時刻型向けの一括コピーの変更 (OLE DB および ODBC)」で説明されているように、新しい日付型または時刻型と関連メタデータは、下位クライアントに対して表示されると、クライアントにも表示されます。

IRowsetFind での比較

新しい日付型または時刻型に対しては、すべての比較演算子を使用できます。これは、日付型または時刻型ではなく文字列型と見なされるためです。

関連項目

概念

日付/時刻の強化 (OLE DB)