如何通过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的主要内容,如果未能解决你的问题,请参考以下文章

如何通过命令行为Teradata驱动程序设置ODBC连接?

如何使用 Access ODBC 通过一个查询更新多个表?

如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?

无法通过 Windows 2012 上的系统 dsn 使用 ODBC 连接连接到 SQL Server 2008

R 中的 ODBC 连接字符串和/或 DSN

如何使用odbc连接数据库?