診斷記錄和欄位

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics 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。 x SQLError 函式。 ODBC 3 中最簡單的錯誤處理函式。 x 是從 RecNumber 參數設定為 1 開始 重複呼叫 SQLGetDiagRec,直到 SQLGetDiagRec 傳回SQL_NO_DATA為止 ,將 RecNumber 遞增 1。 這相當於 ODBC 2。 呼叫 SQLError 的 x 應用程式 ,直到傳回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 connect 函式傳回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 支援工程師指出錯誤引發的位置,這有時有助於診斷問題。

另請參閱

處理錯誤與訊息