診斷記錄和欄位

適用于:SQL Server (Azure SQL Database Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System ( PDW) 的所有支援) 版本

診斷記錄與 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是從RecNumber參數設定為 1 開始重複呼叫SQLGetDiagRec,並將RecNumber遞增 1,直到SQLGetDiagRec傳回SQL_NO_DATA為止。 這相當於 ODBC 2。x 應用程式呼叫 SQLError ,直到傳回SQL_NO_DATA_FOUND為止。

ODBC 3.x 支援比 ODBC 2 更多的診斷資訊。x. 此資訊會儲存在使用 SQLGetDiagField擷取的診斷記錄中其他欄位。

SQL Server Native Client ODBC 驅動程式具有可使用SQLGetDiagField擷取的驅動程式特定診斷欄位。 這些驅動程式特定欄位的標籤會定義在 sqlncli.h 中。 使用這些標籤來擷取與每個診斷記錄相關聯的SQL Server狀態、嚴重性層級、伺服器名稱、程式名稱和行號。 此外,如果應用程式呼叫 SQLGetDiagField 並將 DiagIdentifier 設為 SQL_DIAG_DYNAMIC_FUNCTION_CODE,則 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 支援工程師指出引發錯誤的位置,這有時有助於診斷問題。

另請參閱

處理錯誤與訊息