次の方法で共有


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

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

下位クライアントの動作

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 Date 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 Date 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 によるデータ変換でも同様の問題が発生します。

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

このセクションでは、2008 年SQL Serverより前のバージョンの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

下位サーバーの動作

2008 SQL Serverより前のバージョンのサーバーに接続すると、新しいサーバーの種類名 (たとえば、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)