以前のバージョンの 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 |
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 を使用し、サーバーの列が 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 2008SQL 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 での比較
新しい日付型または時刻型に対しては、すべての比較演算子を使用できます。これは、日付型または時刻型ではなく文字列型と見なされるためです。