連接至資料來源 (ODBC)

配置環境與連接控制代碼,並設定任何連接屬性之後,應用程式會連接到資料來源或驅動程式。您可以用於連接的函數有三種:

  • SQLConnect

  • SQLDriverConnect

  • SQLBrowseConnect

如需有關建立資料來源之連接的詳細資訊,包括可用的各種連接字串選項,請參閱<搭配 SQL Server Native Client 使用連接字串關鍵字>。

SQLConnect

SQLConnect 是最簡單的連接函數。它接受三種參數:資料來源名稱、使用者識別碼與密碼。當這三種參數包含連接到資料庫所需的所有資訊時,使用 SQLConnect。若要這樣做,使用 SQLDataSources 建立資料來源的清單;提示使用者輸入資料來源、使用者識別碼和密碼,然後呼叫 SQLConnect

SQLConnect 會假設資料來源名稱、使用者識別碼和密碼足以連接到資料來源,而且 ODBC 資料來源包含 ODBC 驅動程式建立連接所需的其他所有資訊。不像 SQLDriverConnectSQLBrowseConnectSQLConnect 不會使用連接字串。

SQLDriverConnect

需要的資訊不止資料來源名稱、使用者識別碼和密碼時,使用 SQLDriverConnectSQLDriverConnect 的其中一個參數是包含驅動程式專屬資訊的連接字串。您可能會因為下列原因,使用 SQLDriverConnect 而非 SQLConnect

  • 在連接階段指定驅動程式專屬的資訊。

  • 要求驅動程式提示使用者輸入連接資訊。

  • 不使用 ODBC 資料來源連接。

SQLDriverConnect 連接字串包含一連串的關鍵字-值配對,可指定 ODBC 驅動程式支援的所有連接資訊。除了供驅動程式支援之所有連接資訊使用的驅動程式專屬關鍵字之外,每個驅動程式還支援標準 ODBC 關鍵字 (DSN、FILEDSN、DRIVER、UID、PWD 和 SAVEFILE)。SQLDriverConnect 可用於不使用資料來源連接。例如,其設計為建立 SQL Server 執行個體之「無 DSN」連接的應用程式可以利用定義連接所需之登入識別碼、密碼、網路程式庫、伺服器名稱,以及要使用之預設資料庫的連接字串來呼叫 SQLDriverConnect

使用 SQLDriverConnect 時,有兩個選項可以提示使用者輸入任何需要的連接資訊:

  • 應用程式對話方塊

    您可以建立提示輸入連接資訊的應用程式對話方塊,然後在 NULL 視窗控制代碼與 DriverCompletion 設定為 SQL_DRIVER_NOPROMPT 時,呼叫 SQLDriverConnect。這些參數設定可防止 ODBC 驅動程式開啟自己的對話方塊。當控制應用程式的使用者介面相當重要時,使用此方法。

  • 驅動程式對話方塊

    您可以撰寫應用程式的程式碼,將有效的視窗控制代碼傳遞到 SQLDriverConnect,並將 DriverCompletion 參數設定為 SQL_DRIVER_COMPLETE、SQL_DRIVER_PROMPT 或 SQL_DRIVER_COMPLETE_REQUIRED。接著,驅動程式會產生一個對話方塊來提示使用者輸入連接資訊。這個方法會簡化應用程式的程式碼。

SQLBrowseConnect

SQLBrowseConnect 就像 SQLDriverConnect,會使用連接字串。不過,透過使用 SQLBrowseConnect,應用程式可以在執行階段利用資料來源反覆完成連接字串。這可以讓應用程式執行兩個動作:

  • 建立自己的對話方塊來提示輸入此資訊,藉此保持對其使用者介面的控制。

  • 瀏覽系統中,特定驅動程式可使用的資料來源 (可能是透過數個步驟)。

    例如,使用者介面可能會先瀏覽網路中的伺服器,然後在選擇伺服器之後,瀏覽伺服器中可由驅動程式存取的資料庫。

SQLBrowseConnect 完成成功連接時,它會傳回可在 SQLDriverConnect 後續呼叫上使用的連接字串。

SQL Server Native Client ODBC 驅動程式永遠會在成功的 SQLConnectSQLDriverConnectSQLBrowseConnect 上傳回 SQL_SUCCESS_WITH_INFO。當 ODBC 應用程式在取得 SQL_SUCCESS_WITH_INFO 之後呼叫 SQLGetDiagRec 時,它可能會收到下列訊息:

  • 5701
    表示 SQL Server 將使用者的內容放入資料來源中定義的預設資料庫,或在資料來源沒有預設資料庫時,放入針對連接中所使用之登入識別碼所定義的預設資料庫中。

  • 5703
    表示在伺服器上所使用的語言。

下列範例會顯示針對系統管理員之成功連接所傳回的訊息:

szSqlState = "01000", *pfNativeError = 5701,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
       Changed database context to 'pubs'."
szSqlState = "01000", *pfNativeError = 5703,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
       Changed language setting to 'us_english'."

您可以忽略訊息 5701 和 5703;這些訊息僅供參考。不過,您不得忽略 SQL_SUCCESS_WITH_INFO 傳回碼,因為可能會傳回 5701 或 5703 之外的訊息。例如,如果驅動程式利用過期的目錄預存程序,連接到執行 SQL Server 執行個體的伺服器,在 SQL_SUCCESS_WITH_INFO 之後透過 SQLGetDiagRec 傳回的其中一個錯誤為:

SqlState:   01000
pfNative:   0
szErrorMsg: "[Microsoft][SQL Server Native Client]The ODBC
            catalog stored procedures installed on server
            my65server are version 06.50.0193; version 07.00.0205
            or later is required to ensure proper operation.
            Please contact your system administrator."

適用於 SQL Server 連接的應用程式錯誤處理函數應該呼叫 SQLGetDiagRec,直到傳回 SQL_NO_DATA 為止。接著,它應該會在 pfNative 程式碼為 5701 或 5703 之外的任何訊息上作用。

驗證連接狀態

在 SQL Server 2000 和更新版本中的 SQL_ATTR_CONNECTION_DEAD 和 SQL_COPT_SS_CONNECTION_DEAD 行為與舊版中的行為不同。在 SQL Server 2000 和更新版本中,SQL_ATTR_CONNECTION_DEAD 會傳回連接的最新狀態,這可能不是目前的連接狀態。不過,SQL_COPT_SS_CONNECTION_DEAD 永遠會針對連接的目前狀態查詢網路程式庫。

為區分這些行為,會在 SQL Server 2000 和更新版本的包含檔案中提供 SQL_COPT_SS_CONNECTION_DEAD 的新值。如果使用 SQL Server 7.0 版驅動程式執行應用程式,使用此屬性 (透過 SQL Server 2000 和更新版本標頭建立) 的應用程式將會傳回錯誤 (HY092:屬性/選項識別碼無效)。如果應用程式在 SQL Server 7.0 驅動程式上執行,建議應用程式檢查呼叫 SQLGetConnectAttr 前使用的驅動程式版本,然後使用 SQL_ATTR_CONNECTION_DEAD 來取代 SQL_COPT_SS_CONNECTION_DEAD。