診斷記錄和欄位
適用於: SQL Server Azure SQL 資料庫 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,直到 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支持工程師,特別是引發錯誤的位置,這有時有助於診斷問題。