舊版 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 |
時間欄位會設定為零。 |
如果時間欄位不是零,IRowsetChange 將會因為字串截斷而失敗。 |
||
DBTYPE_DBTIME |
Time(0) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
日期欄位設定為目前的日期。 |
如果小數秒不是零,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 |
時間欄位會設定為零。 |
如果時間欄位不是零,IRowsetChange 將會因為字串截斷而失敗。 |
||
DBTYPE_DBTIME |
Time(0) |
OK |
OK |
|
DBTYPE_DBTIMESTAMP |
日期欄位設定為目前的日期。 |
如果小數秒不是零,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 |
---|---|---|---|---|
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。 這是當小數有效位數大於零時增加的小數點所導致。
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 設定為執行時所使用之存取子的繫結狀態。
如果在連接上有從緩衝區類型到伺服器版本之伺服器類型的支援用戶端轉換,則可以使用所有用戶端緩衝區類型。 在此環境下,「伺服器類型」(Server Type) 意指 ICommandWithParameters::SetParameterInfo 所指定的類型;如果尚未呼叫 ICommandWithParameters::SetParameterInfo,則是緩衝區類型所意味的類型。 也就是說,DBTYPE_DBTIME2 和 DBTYPE_DBTIMESTAMPOFFSET 可以搭配下層伺服器使用,或者當 DataTypeCompatibility=80 時,如果用戶端成功轉換到支援的伺服器類型,也可以這麼做。 當然,如果伺服器類型不正確,當伺服器無法隱含地轉換到實際的伺服器類型時,仍然可能會回報錯誤。
SSPROP_INIT_DATATYPECOMPATIBILITY 行為
當 SSPROP_INIT_DATATYPECOMPATIBILITY 設定為 SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 時,新的日期/時間類型及相關聯的中繼資料會以向下層用戶端顯示的相同方式向用戶端顯示,如<增強型日期/時間類型的大量複製變更 (OLE DB 和 ODBC)>中所述。
IRowsetFind 的相容性
新的日期/時間類型允許使用所有比較運算子,因為它們會顯示為字串類型,而非日期/時間類型。