診斷記錄和欄位
診斷記錄與 ODBC 環境、連接、陳述式或描述項控制代碼相關聯。當任何 ODBC 函數引發 SQL_SUCCESS 或 SQL_INVALID_HANDLE 以外的傳回碼時,該函數所呼叫的控制代碼會有包含參考用訊息或錯誤訊息的相關聯診斷記錄。這些記錄會保留到系統使用該控制代碼呼叫另一個函數為止,屆時將捨棄這些記錄。不論何時,可與控制代碼相關聯的診斷記錄數目沒有任何限制。
共有兩種診斷記錄:標頭和狀態。標頭記錄為記錄 0,而當有狀態記錄時,這兩種記錄分別為記錄 1 和具有更大編號的記錄。診斷記錄包含標頭記錄和狀態記錄的不同欄位。ODBC 元件也可以定義本身的診斷記錄欄位。
標頭記錄中的欄位包含有關函數執行的一般資訊,包括傳回碼、資料列計數、狀態記錄的數目和所執行的陳述式類型。除非 ODBC 函數傳回 SQL_INVALID_HANDLE,否則一定會建立標頭記錄。如需標頭記錄中欄位的完整清單,請參閱<SQLGetDiagField>。
狀態記錄中的欄位包含有關 ODBC 驅動程式管理員、驅動程式或資料來源所傳回的特定錯誤或警告的詳細資訊,包括 SQLSTATE、原生錯誤號碼、診斷訊息、資料行號碼和資料列號碼。只有在函數傳回 SQL_ERROR、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_NEED_DATA 或 SQL_STILL_EXECUTING 時,才會建立狀態記錄。如需狀態記錄中欄位的完整清單,請參閱 SQLGetDiagField。
SQLGetDiagRec 會擷取單一的診斷記錄,及其 ODBC SQLSTATE、原生錯誤號碼和診斷訊息欄位。此功能類似於 ODBC 2.xSQLError 函數。ODBC 3.x 中最簡單的錯誤處理函數是重複地呼叫 SQLGetDiagRec (從設定為 1 的 RecNumber 參數開始,並以 1 遞增 RecNumber),直到 SQLGetDiagRec 傳回 SQL_NO_DATA。這與呼叫 SQLError (直到傳回 SQL_NO_DATA_FOUND 為止) 的 ODBC 2.x 應用程式相當。
ODBC 3.x 支援的診斷資訊比 ODBC 2.x 多很多。這份資訊會儲存在診斷記錄的其他欄位中,這些欄位則是使用 SQLGetDiagField 來擷取。
SQL Server Native Client ODBC 驅動程式具有驅動程式特定的診斷欄位,可以使用 SQLGetDiagField 來擷取。這些驅動程式特定欄位的標籤會定義在 sqlncli.h 中。請使用這些標籤來擷取與每個診斷記錄相關聯的 SQL Server 狀態、嚴重性層級、伺服器名稱、程序名稱和行號。此外,如果應用程式以設定為 SQL_DIAG_DYNAMIC_FUNCTION_CODE 的 DiagIdentifier 呼叫 SQLGetDiagField,sqlncli.h 也會包含驅動程式用來識別 Transact-SQL 陳述式的程式碼定義。
SQLGetDiagField 會由 ODBC 驅動程式管理員使用它從基礎驅動程式快取的錯誤資訊進行處理。在成功建立連接之前,ODBC 驅動程式管理員不會快取驅動程式專用的診斷欄位。如果在完成成功的連接前,呼叫 SQLGetDiagField 以取得驅動程式特定的診斷欄位,則此函數會傳回 SQL_ERROR。如果 ODBC 連接函數傳回 SQL_SUCCESS_WITH_INFO,則連接函數的驅動程式特定的診斷欄位就還不能使用。只有您在連接函數後進行了其他的 ODBC 函數呼叫之後,才可以開始針對驅動程式特定的診斷欄位呼叫 SQLGetDiagField。
SQL Server Native Client ODBC 驅動程式報告的大部分錯誤,只需使用 SQLGetDiagRec 傳回的資訊就可進行有效的診斷。不過,在某些情況下,由驅動程式特定的診斷欄位所傳回的資訊對於診斷錯誤十分重要。針對使用 SQL Server Native Client ODBC 驅動程式的應用程式撰寫 ODBC 錯誤處理常式時,最好也使用 SQLGetDiagField 以至少擷取 SQL_DIAG_SS_MSGSTATE 和 SQL_DIAG_SS_SEVERITY 驅動程式特定的欄位。如果特定錯誤可能會在 SQL Server 程式碼中的數個位置引發,SQL_DIAG_SS_MSGSTATE 會向 Microsoft 支援工程師明確地指出引發錯誤的位址,這項功能有時可以協助診斷問題。