為 ODBC Driver for DB2 疑難排解

在某些情況下,Windows 2000 事件檢視器是針對資料存取進行疑難排解的公用程式。 ODBC Driver for DB2 不會發出事件。 不過,當 SNA (APPC/LU 6.2) 用於 ODBC Driver for DB2 的網路傳輸時,低階 SNA APPC 傳輸會在 SNA 連線上發出事件。

主機整合伺服器提供的 ODBC Driver for DB2 能夠在透過 TCP/IP 使用時追蹤 DRDA 資料流程。 此功能可從隨主機整合伺服器隨附的追蹤公用程式內的 SNADB2 服務追蹤存取。

這項功能會顯示與 APPC 追蹤相同的資料,但沒有控制指標 (例如,What_Received) 。 通訊端錯誤會追蹤,而且錯誤碼可以在 Win32 SDK 提供的 Winsock2.h 中查閱。

當 ODBC Driver for DB2 通過錯誤碼時,查詢傳回碼意義的最佳來源通常是目標 SQL 資料庫的 SQL 參考或 SQL 訊息和程式碼參考。 在此情況下,目標資料庫是 ODBC Driver for DB2 支援的其中一個 DB2 平臺。

ODBC Driver for DB2 會維護名為 SQLCODE 的內部整數變數,以及名為 SQLSTATE 的內部 5 位元組字元字串變數,用來檢查 DB2 上的 SQL 語句執行。 DB2 會在每次執行 SQL 陳述式後設定 SQLCODE。 DB2 會為 SQLCODE 傳回下列值:

  • 若 SQLCODE = 0,表示執行成功。

  • 如果 SQLCODE > 0,則執行成功,並出現警告。

  • 如果 SQLCODE < 0,則執行未成功。

  • SQLCODE = 100,找不到「沒有資料」。 例如, FETCH 語句未傳回任何資料,因為資料指標位於結果資料表的最後一個資料列之後。

    在每次執行 SQL 陳述式後,DB2 也會設定 SQLSTATE。 應用程式會測試 SQLSTATE (而非 SQLCODE),以檢查 SQL 陳述式的執行情形。 只有在錯誤或警告為產品特定) 時,SQLSTATE 的值才會提供常見錯誤狀況的常見程式碼 (SQLSTATE 的值。 此外,SQLSTATE 的用途在於讓應用程式能夠測試特定的錯誤或錯誤類別。

    SQLSTATE 值由二字元的類別代碼值,再加上三字元的子類別代碼值所組成。 SQLSTATE 值的第一個字元可指出 SQL 陳述式的執行是否成功 (等於零表示成功,不等於零則表示不成功)。 類別代碼值代表執行情況成功與否的類別。 下表描述 DB2 所使用的 SQLSTATE 類別代碼。

類別代碼 錯誤類別的描述
00 成功完成。 SQL 語句的執行成功,而且不會產生任何類型的警告或例外狀況。
01 警告
02 無資料
07 動態 SQL 錯誤
08 連接例外狀況
0A 不支援功能
0F 權杖無效
21 基數違規
22 資料例外狀況
23 條件約束違規
24 指標狀態無效
25 交易狀態無效
26 SQL 陳述式識別碼無效
二 維和 交易終止無效
34 指標名稱無效
39 外部函數呼叫例外狀況
40 交易回復
42 語法錯誤或存取規則違規
44 WITH CHECK OPTION 違規
51 應用程式狀態無效
53 運算子無效或規格不一致
54 超過 SQL 或產品限制
55 物件未處於必要狀態
56 其他 SQL 或產品錯誤
57 沒有可用資源或操作員介入
58 系統錯誤

HY000 的 SQLSTATE 值定義為驅動程式特定的錯誤。 SQLSTATE 為 08S01 (連線例外狀況,且子類別代碼為 S01) 也表示驅動程式特定的錯誤。 這表示應該在 ODBC Driver for DB2 隨附的驅動程式特定檔中查閱 SQLCODE。

如果當 ODBC Driver for DB2 傳回 SQLSTATE 為 08S01 時,SQLSTATE 未指出驅動程式特定的錯誤,則表示網路錯誤。 例如,-603 的 SQLCODE 是對應至 db2oledb.h 包含 ODBC Driver for DB2 所提供的檔案中DB2OLEDB_COMM_HOST_CONNECT_FAILED的驅動程式特定錯誤。 SQLSTATE 為 08S01 的錯誤記載于 db2oledb.h 包含檔案中, (位於 SDK\Include 子目錄中主機整合伺服器 CD 上的 SQLCODE 值) 。

下列步驟有助於探討錯誤的原因。 從讀取 ODBC Driver for DB2 傳回的錯誤文字開始。 在某些情況下,錯誤文字可能會提供有限的資訊。 例如,來自 -603 之 SQLCODE 的錯誤文字會讀取:

Test connection failed because of an error in initializing driver.  
Could not connect to specified host.   

接下來應查閱 SQLSTATE 以判斷錯誤來源。 錯誤是 DB2 錯誤、網路用戶端錯誤,還是 ODBC 驅動程式錯誤? SQLSTATE 08S01 定義如下:

Communication link failure.  

此定義旨在通知使用者、系統管理員或開發人員錯誤與 ODBC 驅動程式的基礎網路用戶端相關。

不幸的是,ODBC Driver for DB2 傳回的許多 SQLSTATE 代碼都是 DB2 錯誤,而且不會記載于 ODBC Driver for DB2 說明中。

HY000 的 SQLSTATE 定義為驅動程式特定的錯誤。 08S01 的 SQLSTATE 也表示驅動程式特定的錯誤。 在此情況下,您應該在 ODBC Driver for DB2 隨附的驅動程式特定檔中查閱 SQLCODE。

如果 SQLSTATE 未指出驅動程式特定的錯誤,您應該在目標平臺的適當 DB2 手冊中查閱 SQLCODE。 例如,AS /400 ADVANCED Series DB2 for AS/400 SQL Programming, Version 4, document number SC41-5611-00 document number SC41-5611-00 中記載了 -603 的 SQLCODE。 SQLCODE -603 對應於 DB2 for OS/400 錯誤碼清單中的 SQLSTATE 23515。 例如,此 SQLCODE 的說明如下:

Unique index cannot be created because of duplicate keys.   

當這些附錄中所述的 SQLSTATE 和 SQLCODE 定義與傳回的實際錯誤不符時,通常表示驅動程式特定的錯誤狀況。

瞭解錯誤的最後一個步驟是檢查 db2oledb.h 檔案。 此檔案不是由 Host Integration Client 2000 的安裝程式安裝,但位於 SDK\Include 資料夾中的 CD-ROM。 例如,您可以在 db2oledb.h 檔案的最右邊資料行搜尋接近 603 的值,找到 SQLCODE (-603) 。 例如,找出批註 「/* -600 */」,然後倒數三行到行號 603。 內部錯誤碼 -603 的定義如下:

DB2OLEDB_COMM_HOST_CONNECT_FAILED.  

此錯誤通常表示傳送的設定參數或連接字串有問題。