[英]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.