舊版 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

時間欄位會設定為零。

如果時間欄位不是零,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

Date

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 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::SetParameterInfoITableDefinition::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 的相容性

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