舊版 SQL Server 的新日期和時間功能 (OLE DB)
本主題描述當使用增強日期和時間功能的用戶端應用程式與早于 SQL Server 2008 的 SQL Server 版本通訊時,以及使用早于 SQL Server Native Client 版本的用戶端編譯SQL Server時,預期的行為2008 會將命令傳送至支援增強日期和時間功能的伺服器。
下層用戶端行為
使用 SQL Server 2008 之前的 SQL Server Native Client 版本的用戶端應用程式,會將新的日期/時間類型視為 nvarchar
資料行。 資料行內容是常值表示法。 For more information, see the "Data Formats: Strings and Literals" section of Data Type Support for OLE DB Date and Time Improvements. 資料行大小是針對資料行指定之有效位數的最大常值長度。
資料庫目錄 API 將會傳回與傳回到用戶端之下層資料類型程式碼一致的中繼資料 (例如,nvarchar
),以及相關聯的下層表示法 (例如,適當的常值格式)。 不過,傳回的資料類型名稱將是實際SQL Server 2008 類型名稱。
當下層用戶端應用程式針對SQL Server 2008 (或更新版本的) 伺服器執行時,其架構變更為日期/時間類型,預期的行為如下所示:
OLE DB 用戶端類型 | SQL Server 2005 類型 | SQL Server 2008 (或更新版本) 類型 | 結果轉換 (伺服器到用戶端) | 參數轉換 (用戶端到伺服器) |
---|---|---|---|---|
DBTYPE_DBDATE | Datetime | Date | [確定] | [確定] |
DBTYPE_DBTIMESTAMP | 時間欄位會設定為零。 | 如果時間欄位不是零,IRowsetChange 將會因為字串截斷而失敗。 | ||
DBTYPE_DBTIME | Time(0) | [確定] | [確定] | |
DBTYPE_DBTIMESTAMP | 日期欄位設定為目前的日期。 | 如果小數秒為非零,IRowsetChange 將會因為字串截斷而失敗。 忽略日期。 |
||
DBTYPE_DBTIME | Time(7) | 失敗 - 不正確時間常值。 | 確定 | |
DBTYPE_DBTIMESTAMP | 失敗 - 不正確時間常值。 | 確定 | ||
DBTYPE_DBTIMESTAMP | Datetime2 (3) | [確定] | [確定] | |
DBTYPE_DBTIMESTAMP | Datetime2 (7) | [確定] | [確定] | |
DBTYPE_DBDATE | Smalldatetime | Date | [確定] | [確定] |
DBTYPE_DBTIMESTAMP | 時間欄位會設定為零。 | 如果時間欄位不是零,IRowsetChange 將會因為字串截斷而失敗。 | ||
DBTYPE_DBTIME | Time(0) | [確定] | [確定] | |
DBTYPE_DBTIMESTAMP | 日期欄位設定為目前的日期。 | 如果小數秒為非零,IRowsetChange 將會因為字串截斷而失敗。 忽略日期。 |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | [確定] | [確定] |
確定表示如果它與 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。 這是當小數有效位數大於零時增加的小數點所導致。
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 設定為執行時所使用之存取子的繫結狀態。
如果在連接上有從緩衝區類型到伺服器版本之伺服器類型的支援用戶端轉換,則可以使用所有用戶端緩衝區類型。 在此內容中, 伺服器類型 表示 ICommandWithParameters::SetParameterInfo 所指定的類型,如果未呼叫 ICommandWithParameters::SetParameterInfo,則由緩衝區類型隱含。 也就是說,DBTYPE_DBTIME2 和 DBTYPE_DBTIMESTAMPOFFSET 可以搭配下層伺服器使用,或者當 DataTypeCompatibility=80 時,如果用戶端成功轉換到支援的伺服器類型,也可以這麼做。 當然,如果伺服器類型不正確,當伺服器無法隱含地轉換到實際的伺服器類型時,仍然可能會回報錯誤。
SSPROP_INIT_DATATYPECOMPATIBILITY 行為
當SSPROP_INIT_DATATYPECOMPATIBILITY設定為 SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000時,新的日期/時間類型和相關聯的中繼資料會顯示在用戶端,如增強 型日期和時間類型的大量複製變更中所述, (OLE DB 和 ODBC) 。
IRowsetFind 的相容性
新的日期/時間類型允許使用所有比較運算子,因為它們會顯示為字串類型,而非日期/時間類型。