從伺服器到用戶端執行的轉換
本主題描述在 SQL Server 2008 (或更新版本) 和以 SQL Server Native Client OLE DB 撰寫之用戶端應用程式之間執行的日期/時間轉換。
轉換
下表描述傳回用戶端之類行與繫結中之類型之間的轉換。 對於輸出參數,如果已經呼叫 ICommandWithParameters::SetParameterInfo,而且在 pwszDataSourceType 中指定的類型與伺服器上的實際類型不符,伺服器將會執行隱含轉換,而且傳回用戶端的類型將會與透過 ICommandWithParameters::SetParameterInfo 指定的類型相符。 當伺服器的轉換規則與本主題中描述的規則不同時,這可能會導致非預期的轉換結果。 例如,必須提供預設日期時,SQL Server 會使用 1900-1-1 而非 1899-12-30。
To -> 從 |
DATE |
DBDATE |
DBTIME |
DBTIME2 |
DBTIMESTAMP |
DBTIMESTAMPOFFSET |
FILETIME |
BYTES |
VARIANT |
SSVARIANT |
BSTR |
STR |
WSTR |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date |
1,7 |
OK |
- |
- |
1 |
1,3 |
1,7 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Time |
5,6,7 |
- |
9 |
OK |
6 |
3,6 |
5,6 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Smalldatetime |
7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7 (VT_DATE) |
OK |
OK |
4 |
4 |
Datetime |
5,7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7 (VT_DATE) |
OK |
OK |
4 |
4 |
Datetime2 |
5,7 |
8 |
9,10 |
10 |
7 |
3 |
5,7 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Datetimeoffset |
5,7,11 |
8,11 |
9,10,11 |
10,11 |
7,11 |
OK |
5,7,11 |
- |
OK (VT_BSTR) |
OK |
OK |
4 |
4 |
Char, Varchar, Nchar, Nvarchar |
7, 13 |
12 |
12,9 |
12 |
12 |
12 |
7,13 |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
Sql_variant (datetime) |
7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7 (VT_DATE) |
OK |
OK |
4 |
4 |
Sql_variant (smalldatetime) |
7 |
8 |
9,10 |
10 |
OK |
3 |
7 |
- |
7 (VT_DATE) |
OK |
OK |
4 |
4 |
Sql_variant (date) |
1,7 |
OK |
2 |
2 |
1 |
1,3 |
1,7 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
Sql_variant (time) |
5,6,7 |
2 |
6 |
OK |
6 |
3,6 |
5,6 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
Sql_variant (datetime2) |
5,7 |
8 |
9,10 |
10 |
OK |
3 |
5,7 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
Sql_variant (datetimeoffset) |
5,7,11 |
8,11 |
9,10,11 |
10,11 |
7,11 |
OK |
5,7,11 |
- |
OK(VT_BSTR) |
OK |
OK |
4 |
4 |
符號的索引鍵
符號 |
意義 |
---|---|
OK |
不需要任何轉換。 |
- |
不支援轉換。 如果繫結在呼叫 IAccessor::CreateAccessor 時經過驗證,會在 rgStatus 中傳回 DBBINDSTATUS_UPSUPPORTEDCONVERSION。 當存取子驗證延遲時,會設定 DBSTATUS_E_BADACCESSOR。 |
1 |
時間欄位會設定為零。 |
2 |
DBSTATUS_E_CANTCONVERTVALUE 已設定。 |
3 |
時區會設定為零。 |
4 |
如果用戶端緩衝區不夠大,會設定 DBSTATUS_S_TRUNCATED。 當伺服器類型包含小數秒時,結果字串中的位數會完全符合伺服器類型的小數位數。 |
5 |
截斷的秒數或小數秒數會被忽略。 |
6 |
除非來源為字串時間常值,而且目的地為 DBTYPE_DATE,否則日期會設定為目前的日期。 在此情況下,會使用 1899-12-30。 |
7 |
如果值溢位,會設定 DBSTATUS_E_DATAOVERFLOW。 |
8 |
忽略時間欄位。 |
9 |
忽略小數秒欄位。 |
10 |
忽略日期元件。 |
11 |
時間會轉換成用戶端時區。 如果此轉換期間發生錯誤,則會設定 DBSTATUS_E_DATAOVERFLOW。 |
12 |
此字串會剖析為 ISO 常值,並轉換為目標類型。 如果失敗,字串會剖析為 OLE 日期常值 (也有時間元件),並從 OLE 日期 (DBTYPE_DATE) 轉換為目標類型。 字串必須符合進行 ISO 格式剖析所允許之目標類型常值的語法才會成功。 若要讓 OLE 剖析成功,字串必須符合 OLE 所識別的語法。 如果無法剖析字串,則會設定 DBSTATUS_E_CANTCONVERTVALUE。 如果任何元件值超出範圍,會設定 DBSTATUS_E_DATAOVERFLOW。 |
13 |
此字串會剖析為 ISO 常值,並轉換為目標類型。 如果失敗,字串會剖析為 OLE 日期常值 (也有時間元件),並從 OLE 日期 (DBTYPE_DATE) 轉換為目標類型。 除非目的地為 DBTYPE_DATE 或 DBTYPE_DBTIMESTAMP,否則字串必須符合日期時間常值的語法。 如果是這種狀況,ISO 格式剖析允許使用日期時間或時間嘗試才會成功。 若要讓 OLE 剖析成功,字串必須符合 OLE 所識別的語法。 如果無法剖析字串,則會設定 DBSTATUS_E_CANTCONVERTVALUE。 如果任何元件值超出範圍,會設定 DBSTATUS_E_DATAOVERFLOW。 |