共用方式為


舊版 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 (或更新版本) 。

只有下列最常見的結構描述變更已經列入考慮:

  • 在符合邏輯之處使用新的類型時,應用程式僅需要一個日期或時間值。 不過,系統會強迫應用程式使用 datetimesmalldatetime,因為無法使用個別的日期或時間類型。

  • 使用新類型會得到額外的小數秒精確度或正確度。

  • 切換到 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 的相容性

新的日期/時間類型允許使用所有比較運算子,因為它們會顯示為字串類型,而非日期/時間類型。

另請參閱

日期和時間改善 (OLE DB)