分享方式:


撰寫 ODBC 3.x 應用程式

當 ODBC 2.x 應用程式升級至 ODBC 3.x 時,為了適用於 ODBC 2.x3.x 驅動程式,應該加以撰寫。 應用程式應納入條件碼,以便充分利用 ODBC 3.x 功能。

SQL_ATTR_ODBC_VERSION 環境屬性應設定為 SQL_OV_ODBC2。 如此便能確保就行為變更一節所述的變更方面,驅動程式的行為與 ODBC 2.x 驅動程式相同。

如果應用程式會使用新功能一節所述的任何功能,則應使用條件碼來判斷驅動程式為 ODBC 3.x 或 ODBC 2.x 驅動程式。 應用程式使用 SQLGetDiagFieldSQLGetDiagRec 取得 ODBC 3.x SQLSTATE,同時對這些條件碼片段進行錯誤處理。 針對新功能,您應考慮下列幾點:

  • 當陣列大小大於 1 時,受資料列集大小變更行為影響的應用程式須小心不要呼叫 SQLFetch。 這些應用程式應使用對 SQLSetStmtAttr 的呼叫取代對 SQLExtendedFetch 的呼叫,從而設定 SQL_ATTR_ARRAY_STATUS_PTR 陳述式屬性和 SQLFetchScroll,以便其具有適用於 ODBC 3.x 和 ODBC 2.x 驅動程式的常見程式碼。 由於就 ODBC 2.x 驅動程式而言,具有 SQL_ATTR_ROW_ARRAY_SIZE 的 SQLSetStmtAttr 會對應至具有 SQL_ROWSET_SIZE 的 SQLSetStmtAttr,因此應用程式只須為其多重擷取作業設定 SQL_ATTR_ROW_ARRAY_SIZE。

  • 大部分正在升級的應用程式實際上不會受到 SQLSTATE 程式碼變更的影響。 對於受影響的應用程式而言,在大多數情況下,他們可以使用「SQLSTATE 對應」區段中的錯誤轉換表執行機械搜尋及取代,從而將 ODBC 3.x 錯誤碼轉換為 ODBC 2.x 程式碼。 由於 ODBC 3.x 驅動程式管理員會執行從 ODBC 2.x SQLSTATE 到 ODBC 3.x SQLSTATE 的對應,因此這些應用程式寫入器只須檢查 ODBC 3.x SQLSTATE,而不必擔心須在條件碼中包含 ODBC 2.x SQLSTATE。

  • 如果應用程式充分利用日期、時間和時間戳記資料類型,則應用程式可以自行宣告為 ODBC 2.x 應用程式,並使用現有程式碼而非條件碼。

升級亦須包含下列步驟:

  • 在配置連線之前呼叫 SQLSetEnvAttr,以便將 SQL_ATTR_ODBC_VERSION 環境屬性設定為 SQL_OV_ODBC2。

  • 使用 SQL_HANDLE_ENV、SQL_HANDLE_DBC 或 SQL_HANDLE_STMT 的適當 HandleType 引數,將所有對 SQLAllocEnvSQLAllocConnectSQLAllocStmt 的呼叫取代為對 SQLAllocHandle 的呼叫。

  • 使用 SQL_HANDLE_DBC 或 SQL_HANDLE_STMT 的適當 HandleType 引數,將所有對 SQLFreeEnvSQLFreeConnect 的呼叫取代為對 SQLFreeHandle 的呼叫。

  • 將對 SQLSetConnectOption 的所有呼叫取代為對 SQLSetConnectAttr 的呼叫。 如果設定值為字串的屬性,請適當地設定 StringLength 引數。 將 Attribute 引數從 SQL_XXXX 變更為 SQL_ATTR_XXXX。

  • 將對 SQLGetConnectOption 的所有呼叫取代為對 SQLGetConnectAttr 的呼叫。 如果取得字串或二進位屬性,請將 BufferLength 設定為適當的值,並傳入 StringLength 引數。 將 Attribute 引數從 SQL_XXXX 變更為 SQL_ATTR_XXXX。

  • 將對 SQLSetStmtOption 的所有呼叫取代為對 SQLSetStmtAttr 的呼叫。 如果設定值為字串的屬性,請適當地設定 StringLength 引數。 將 Attribute 引數從 SQL_XXXX 變更為 SQL_ATTR_XXXX。

  • 將對 SQLGetStmtOption 的所有呼叫取代為對 SQLGetStmtAttr 的呼叫。 如果取得字串或二進位屬性,請將 BufferLength 設定為適當的值,並傳入 StringLength 引數。 將 Attribute 引數從 SQL_XXXX 變更為 SQL_ATTR_XXXX。

  • 將對 SQLTransact 的所有呼叫取代為對 SQLEndTran 的呼叫。 如果 SQLTransact 呼叫中最右邊的有效控制代碼是環境控制代碼,則 SQL_HANDLE_ENV 的 HandleType 參數應在具有適當 Handle 引數的 SQLEndTran 呼叫中使用。 如果 SQLTransact 呼叫中最右邊的有效控制代碼是連線控制代碼,則 SQL_HANDLE_DBC 的 HandleType 參數應在具有適當 Handle 引數的 SQLEndTran 呼叫中使用。

  • 將所有對 SQLColAttributes 的呼叫取代為對 SQLColAttribute的呼叫。 如果 FieldIdentifier 引數是 SQL_COLUMN_PRECISION、SQL_COLUMN_SCALE 或 SQL_COLUMN_LENGTH,請勿變更函式名稱以外的任何項目。 如果都不是,請將 FieldIdentifier 從 SQL_COLUMN_XXXX 變更為 SQL_DESC_XXXX。 如果 FieldIdentifier 是 SQL_DESC_CONCISE_TYPE,且資料類型為日期時間資料類型,請變更為對應的 ODBC 3.x 資料類型。

  • 如果使用區塊游標、可捲動的資料指標或兩者併用,應用程式會執行下列動作:

    • 使用 SQLSetStmtAttr 設定資料列集大小、資料指標類型和資料指標並行。

    • 呼叫 SQLSetStmtAttr 將 SQL_ATTR_ROW_STATUS_PTR 設定為指向狀態記錄的陣列。

    • 呼叫 SQLSetStmtAttr 將 SQL_ATTR_ROWS_FETCHED_PTR 設定為指向 SQLINTEGER。

    • 執行必要繫結,並執行 SQL 陳述式。

    • 在迴圈中呼叫 SQLFetchScroll,以擷取資料列並在結果集中四處移動。

    • 若要依書簽擷取,應用程式會呼叫 SQLSetStmtAttr,將 SQL_ATTR_FETCH_BOOKMARK_PTR 設定變數,該變數會包含要擷取的資料列書簽,並使用 SQL_FETCH_BOOKMARK 的 FetchOrientation 引數呼叫 SQLFetchScroll

  • 如果使用參數陣列,應用程式會執行下列動作:

    • 呼叫 SQLSetStmtAttr,將 SQL_ATTR_PARAMSET_SIZE 屬性設定為參數陣列的大小。

    • 呼叫 SQLSetStmtAttr,將 SQL_ATTR_ROWS_PROCESSED_PTR 設定為指向內部 UDWORD 變數。

    • 視情況執行準備、繫結和執行作業。

    • 如果出於某些原因 (例如 SQL_NEED_DATA) 導致執行停止,則可以透過檢查 SQL_ATTR_ROWS_PROCESSED_PTR 所指向的位置來尋找參數的「目前」資料列。

此章節包含下列主題。