次の方法で共有


以前のバージョンの 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 日時 日付 [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 を使用し、サーバー列が日付の場合、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
日付 DBTYPE_WSTR 10 ~0 ~0
時間 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
日付 DBTYPE_WSTR 10 ヌル ヌル
時間 DBTYPE_WSTR 8、10..16 ヌル ヌル
smalldatetime(スモールデイトタイム) DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ヌル ヌル
datetimeoffset (デイトタイムオフセット) DBTYPE_WSTR 26,28..34 ヌル ヌル

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO 構造体は、次の情報を返します。

パラメーターの型 wType ulColumnSize bPrecision bScale
日付 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 行セット

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

列の種類 データ型 CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
日付 DBTYPE_WSTR 10 20 ヌル
時間 DBTYPE_WSTR 8、10..16 16,20..32 ヌル
smalldatetime(スモールデイトタイム) DBTYPE_DBTIMESTAMP ヌル ヌル 0
datetime DBTYPE_DBTIMESTAMP ヌル ヌル 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 ヌル
datetimeoffset (デイトタイムオフセット) DBTYPE_WSTR 26,28..34 52, 56..68 ヌル

PROCEDURE_PARAMETERS 行セット

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

列の種類 データ型 CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
日付 DBTYPE_WSTR 10 20 日付
時間 DBTYPE_WSTR 8、10..16 16,20..32 時間
smalldatetime(スモールデイトタイム) DBTYPE_DBTIMESTAMP ヌル ヌル smalldatetime(スモールデイトタイム)
datetime DBTYPE_DBTIMESTAMP ヌル ヌル datetime
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
datetimeoffset (デイトタイムオフセット) DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset (デイトタイムオフセット)

PROVIDER_TYPES 行セット

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

型 ->

コラム
日付 時間 smalldatetime(スモールデイトタイム) datetime datetime2 datetimeoffset (デイトタイムオフセット)
TYPE_NAME 日付 時間 smalldatetime(スモールデイトタイム) datetime datetime2 datetimeoffset (デイトタイムオフセット)
データ型 DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 23 二十七 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS ヌル ヌル ヌル ヌル ヌル ヌル
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
検索 DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE ヌル ヌル ヌル ヌル ヌル ヌル
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 日付 時間 smalldatetime(スモールデイトタイム) datetime datetime2 datetimeoffset (デイトタイムオフセット)
MINIMUM_SCALE ヌル ヌル ヌル ヌル ヌル ヌル
MAXIMUM_SCALE ヌル ヌル ヌル ヌル ヌル ヌル
GUID(グローバルユニーク識別子) ヌル ヌル ヌル ヌル ヌル ヌル
TYPELIB ヌル ヌル ヌル ヌル ヌル ヌル
バージョン ヌル ヌル ヌル ヌル ヌル ヌル
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 が設定されます。

接続時に、サーバーのバージョンに対して、クライアントでのバッファーの型からサーバーの型への変換がサポートされている場合は、クライアントのすべてのバッファーの型を使用できます。 このコンテキストでは、 server 型 は、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)