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