如何通过c++连接ODBC DSN
Posted
技术标签:
【中文标题】如何通过c++连接ODBC DSN【英文标题】:How to connect to ODBC DSN through c++ 【发布时间】:2019-12-18 15:50:47 【问题描述】:我做了一个 PostgreSQL30 数据源名称。我对其进行了测试,并设法通过 ODBC 数据源窗口管理器连接到该 dsn。有一个按钮测试,它显示消息对话框,告诉我连接成功。
现在我想知道如何通过 c++ 代码连接到该 DSN 并获取一些数据。
这是我的代码,我在网上看到几个例子并想出了这个代码
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 并获取一些数据
【问题讨论】:
【参考方案1】:事实上,在执行 SQLConnect 调用时,ODBC 驱动程序管理器会对 ODBC 驱动程序进行这些调用:在这个阶段,它“知道”您要使用哪个驱动程序。查看 SQLConnect 函数说明,“注释”部分:
“在应用程序调用函数(SQLConnect、SQLDriverConnect 或 SQLBrowseConnect)连接到驱动程序之前,驱动程序管理器不会连接到驱动程序。在此之前,驱动程序管理器使用自己的句柄和管理连接信息。当应用程序调用连接函数时,驱动程序管理器检查当前是否连接到指定 ConnectionHandle 的驱动程序:
如果未连接到驱动程序,则驱动程序管理器会连接到驱动程序并调用 HandleType 为 SQL_HANDLE_ENV 的 SQLAllocHandle、HandleType 为 SQL_HANDLE_DBC 的 SQLAllocHandle、SQLSetConnectAttr(如果应用程序指定了任何连接属性)和驱动程序中的连接功能。如果驱动程序返回 SQLSetConnectAttr 错误,则驱动程序管理器返回 SQLSTATE IM006(驱动程序的 SQLSetConnectOption 失败)和连接函数的 SQL_SUCCESS_WITH_INFO。有关详细信息,请参阅连接到数据源或驱动程序。
如果指定的驱动程序已连接到 ConnectionHandle,则驱动程序管理器仅调用驱动程序中的连接函数。在这种情况下,驱动程序必须确保 ConnectionHandle 的所有连接属性保持其当前设置。
如果连接到不同的驱动程序,则驱动程序管理器调用 SQLFreeHandle,其 HandleType 为 SQL_HANDLE_DBC,然后,如果在该环境中没有连接其他驱动程序,它调用 SQLFreeHandle,其 HandleType 为 SQL_HANDLE_ENV。驱动程序,然后断开该驱动程序。然后它会执行与未连接驱动程序时相同的操作。
然后驱动程序分配句柄并初始化自己。”
全文在这里:SQLConnect function comments
【讨论】:
【参考方案2】:const char* szDSN = "PostgreSQL30"; // DataSourceName (config in windows
control panel)
如果您签入 ODBC 数据源,将使用适当的驱动程序创建此 DSN (PostgreSQL30)。驱动管理器根据配置的 ODBC 数据源信息知道要加载哪个驱动。
【讨论】:
以上是关于如何通过c++连接ODBC DSN的主要内容,如果未能解决你的问题,请参考以下文章
如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?