簡體   English   中英

如何通過c++連接ODBC DSN

[英]How to connect to ODBC DSN through c++

我做了一個PostgreSQL30的數據源名稱。 我對其進行了測試,並設法通過 ODBC 數據源 window 管理器連接到該 dsn。 有一個按鈕測試,它顯示消息對話框,告訴我連接成功。

現在我想知道如何通過 c++ 代碼連接到該 DSN 並獲取一些數據。

這是我的代碼,我在網上看到了幾個 examplex 並想出了這段代碼

enter code here

HENV hEnv = NULL; // for allocating memory usingSQLAllocEnv
HDBC hDBC = NULL; // connection handler
HSTMT hStmt = NULL; // statement handler
const char* szDSN = "PostgreSQL30"; // DataSourceName (config in windows 
control panel)
const char* szUID = "postgres"; //username of the database
const char* szPasswd = "postgres"; //password of the database

RETCODE retcode;
int rcod = 1;
int i, j, no = 2;



int main()
{ 
  retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);

  std::cout << retcode << std::endl;

  SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

  retcode = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC);

  std::cout << retcode << std::endl;

   retcode = SQLConnectA(hDBC,(SQLCHAR*)szDSN, SQL_NTS, (SQLCHAR*)szUID, SQL_NTS, 
  (SQLCHAR*)szPasswd, 
  SQL_NTS);


std::cout << (SQLCHAR*)szUID << std::endl;


if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
    // connected!!
    std::cout << "Hello World!\n SUCCESSS COME ON PLEASE";
}
else {
    std::cout << retcode << std::endl;
}


SQLFreeHandle(SQL_HANDLE_ENV, &hEnv);
SQLFreeHandle(SQL_HANDLE_DBC, &hDBC);

}

但我無法理解為什么會這樣,我的意思是這段代碼如何知道調用由 Postgres 驅動程序實現的 SQLAllocHandle?

我的問題是如何通過 C++ 代碼連接到 DSN 並獲取一些數據

事實上,在執行 SQLConnect 調用時,ODBC 驅動程序管理器會對 ODBC 驅動程序進行這些調用:在此階段,它“知道”您要使用哪個驅動程序。 查看SQLConnect函數說明,“注釋”部分:

“在應用程序調用函數(SQLConnect、SQLDriverConnect 或 SQLBrowseConnect)連接到驅動程序之前,驅動程序管理器不會連接到驅動程序。在那之前,驅動程序管理器使用自己的句柄並管理連接信息。當應用程序調用連接函數,驅動程序管理器檢查驅動程序當前是否連接到指定的 ConnectionHandle:

  • 如果未連接到驅動程序,驅動程序管理器將連接到驅動程序並調用 HandleType 為 SQL_HANDLE_ENV 的 SQLAllocHandle、句柄類型為 SQL_HANDLE_DBC 的 SQLAllocHandle、SQLSetConnectAttr(如果應用程序指定了任何連接屬性)以及驅動程序中的連接函數。 如果驅動程序返回 SQLSetConnectAttr 錯誤,驅動程序管理器將返回 SQLSTATE IM006(驅動程序的 SQLSetConnectOption 失敗)和 SQL_SUCCESS_WITH_INFO 用於連接函數。 有關更多信息,請參閱連接到數據源或驅動程序。

  • 如果指定的驅動程序已經連接到 ConnectionHandle 上,則驅動程序管理器僅調用驅動程序中的連接函數。 在這種情況下,驅動程序必須確保 ConnectionHandle 的所有連接屬性都保持其當前設置。

  • 如果連接到不同的驅動程序,驅動程序管理器調用 SQLFreeHandle 的 HandleType 為 SQL_HANDLE_DBC,然后,如果在該環境中沒有連接到其他驅動程序,則它調用連接的驅動程序中的 HandleType 為 SQL_HANDLE_ENV 的 SQLFreeHandle,然后斷開該驅動程序的連接. 然后它執行與驅動程序未連接時相同的操作。

然后驅動程序分配句柄並初始化自己。”

全文在這里: SQLConnect 函數注釋

const char* szDSN = "PostgreSQL30"; // DataSourceName (config in windows 
control panel)

如果您簽入 ODBC 數據源,將使用適當的驅動程序創建此 DSN (PostgreSQL30)。 驅動管理器根據配置的ODBC數據源信息知道加載哪個驅動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM