Share via


從 SQL Server 2005 Native Client 將應用程式更新至 SQL Server 2008 R2 Native Client

本主題討論自 SQL Server 2005 中的 SQL Server Native Client 起,SQL Server Native Client 中的重大變更。

當您從 Microsoft Data Access Components (MDAC) 升級為 SQL Server Native Client 時,可能也會看見一些行為差異。如需詳細資訊,請參閱<從 MDAC 將應用程式更新至 SQL Server Native Client>。

SQL Server Native Client 10.0 中已經變更的行為

描述

OLE DB 只會填補至定義的小數位數。

如果轉換作業會將轉換的資料傳送給伺服器,SQL Server Native Client 10.0 最多只會在資料中用尾端零填滿至 datetime 值的最大長度。SQL Server Native Client 9.0 和舊版則會填滿至 9 位數。

針對 ICommandWithParameter::SetParameterInfo 驗證 DBTYPE_DBTIMESTAMP。

SQL Server Native Client 10.0 會實作 OLE DB 需求,好讓 ICommandWithParameter::SetParameterInfo 中的 bScale 可針對 DBTYPE_DBTIMESTAMP 設定為小數秒的有效位數。

sp_columns 預存程序現在會針對 IS_NULLABLE 資料行傳回 "NO",而非 "NO "

在 SQL Server Native Client 10.0 中,sp_columns 預存程序會針對 IS_NULLABLE 資料行傳回 "NO",而非 "NO "

SQLSetDescRecSQLBindParameterSQLBindCol 現在會執行一致性檢查。

在 SQL Server Native Client 10.0 之前,設定 SQL_DESC_DATA_PTR 並不會檢查 SQLSetDescRecSQLBindParameterSQLBindCol 中任何描述項類型的一致性。

SQLCopyDesc 現在會執行描述項一致性檢查。

在 SQL Server Native Client 10.0 之前,SQLCopyDesc 不會在特定記錄上設定 SQL_DESC_DATA_PTR 欄位時執行一致性檢查。

SQLGetDescRec 不再執行描述項一致性檢查。

在 SQL Server Native Client 10.0 之前,SQLGetDescRec 會在設定 SQL_DESC_DATA_PTR 欄位時執行描述項一致性檢查。這不是 ODBC 規格所需,而且在 SQL Server Native Client 10.0 中,將不再執行這項一致性檢查。

當日期超出範圍時傳回不同錯誤。

如果是 datetime 類型,SQL Server Native Client 10.0 將會針對超出範圍的日期傳回與舊版不同的錯誤號碼。

具體而言,SQL Server Native Client 9.0 會針對轉換為 datetime 之字串內所有超出範圍的年份值傳回 22007,而 SQL Server Native Client 10.0 則會在日期位於 datetime2 支援的範圍內但是超出 datetime 或 smalldatetime 的支援範圍時,傳回 22008。

datetime 值會截斷小數秒且不會四捨五入 (如果四捨五入會改變日期的話)。

在 SQL Server Native Client 10.0 之前,傳送給伺服器之 datetime 值的用戶端行為是要四捨五入到最接近的 1/300 秒。在 SQL Server Native Client 10.0 中,這個情況會造成小數秒被截斷 (如果四捨五入會改變日期的話)。

可能會截斷 datetime 值的秒數。

如果您繫結至類型識別碼為 DBTYPE_DBTIMESTAMP (OLE DB) 或 SQL_TIMESTAMP (ODBC) 且小數位數為 0 的 datetime 資料行,則使用 SQL Server 2008 Native Client (或更新版本) 建置並且連接至 SQL Server 2005 (或之前版本) 伺服器的應用程式,將會截斷傳送至伺服器的資料中時間部分的秒和小數秒。

例如:

輸入資料:1994-08-21 21:21:36.000

插入的資料:1994-08-21 21:21:00.000

從 DBTYPE_DBTIME 轉換成 DBTYPE_DATE 的 OLE DB 資料轉換作業不會再造成日期變更。

在 SQL Server Native Client 10.0 之前,如果 DBTYPE_DATE 的時間部分在午夜的半秒鐘之內,OLE DB 轉換程式碼會造成日期變更。在 SQL Server Native Client 10.0 中,日期將不會變更 (小數秒會被截斷,而且不會四捨五入)。

IBCPSession::BCColFmt 轉換變更。

在 SQL Server Native Client 10.0 中,當您使用 IBCPSession::BCOColFmt 將 SQLDATETIME 或 SQLDATETIME 轉換成字串類型時,便會匯出小數值。例如,將 SQLDATETIME 類型轉換成 SQLNVARCHARMAX 類型時,便會傳回舊版的 SQL Server Native Client。

1989-02-01 00:00:00. SQL Server Native Client 10.0 會傳回 1989-02-01 00:00:00.0000000。

傳送的資料大小必須符合 SQL_LEN_DATA_AT_EXEC 中指定的長度。

當使用 SQL_LEN_DATA_AT_EXEC 時,資料的大小必須符合您使用 SQL_LEN_DATA_AT_EXEC 所指定的長度。您可以使用 SQL_DATA_AT_EXEC,但是使用 SQL_LEN_DATA_AT_EXEC 可能會有效能上的好處。

使用 BCP API 的自訂應用程式現在可以看到警告。

如果資料長度大於所有類型之欄位所指定的長度,BCP API 將會產生一則警告訊息。之前這個警告只針對字元類型來提供,但是將不會針對所有類型發出。

將空字串插入繫結為日期/時間類型的 sql_variant 中會產生錯誤。

在 SQL Server Native Client 9.0 中,將空字串插入繫結為日期/時間類型的 sql_variant 中並不會產生錯誤。SQL Server Native Client 10.0 在這種情況下會正確地產生錯誤。

更嚴格的 SQL_C_TYPE _TIMESTAMP 和 DBTYPE_DBTIMESTAMP 參數驗證。

在 SQL Server 2008 Native Client 之前,SQL Server 會將 datetime 值四捨五入,以符合 datetime 和 smalldatetime 資料行的小數位數。SQL Server 2008 Native Client (和更新版本) 套用的驗證規則,要比 ODBC 核心規格內針對小數秒所定義的規則更嚴格。如果一定要截斷尾端位數,才能使用用戶端繫結所指定或默許的小數位數來將參數值轉換成 SQL 類型,便會傳回錯誤。

SQL Server 可能會在觸發程序執行時傳回不同的結果。

SQL Server 2008 中導入的變更可能會使得應用程式從陳述式中傳回不同的結果,該陳述式會在 NOCOUNT OFF 有效時造成觸發程序的執行。在此狀況下,您的應用程式可能會產生錯誤。若要解決這個錯誤,請在觸發程序中設定 NOCOUNT ON,或是呼叫 SQLMoreResults 前往下一個結果。