如何通过 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 并获取一些数据

事实上,ODBC 驱动程序管理器在执行您的 SQLConnect 调用时对 ODBC 驱动程序进行了这些调用:在这个阶段它 "knows" 您要使用哪个驱动程序。查看 SQLConnect 函数说明,"Comments" 部分:

“在应用程序调用函数(SQLConnect、SQLDriverConnect 或 SQLBrowseConnect)连接到驱动程序之前,驱动程序管理器不会连接到驱动程序。在那之前,驱动程序管理器使用它自己的句柄并管理连接信息。当应用程序调用连接函数时,驱动程序管理器检查当前是否连接到指定的 ConnectionHandle 的驱动程序:

  • 如果未连接到驱动程序,驱动程序管理器将连接到驱动程序并调用 HandleType 为 SQL_HANDLE_ENV 的 SQLAllocHandle、HandleType 为 SQL_HANDLE_DBC 的 SQLAllocHandle、SQLSetConnectAttr (如果应用程序指定了任何连接属性),以及驱动程序中的连接函数。如果驱动程序为 SQLSetConnectAttr 返回错误,驱动程序管理器 returns SQLSTATE IM006(驱动程序的 SQLSetConnectOption 失败)和连接函数 SQL_SUCCESS_WITH_INFO。有关详细信息,请参阅连接到数据源或驱动程序。

  • 如果ConnectionHandle上已经连接到指定的驱动程序,驱动程序管理器只调用驱动程序中的连接函数。在这种情况下,驱动程序必须确保 ConnectionHandle 的所有连接属性都保持其当前设置。

  • 如果连接到不同的驱动程序,驱动程序管理器调用 SQLFreeHandle,HandleType 为 SQL_HANDLE_DBC,然后,如果在该环境中没有连接到其他驱动程序,它调用 SQLFreeHandle在连接的驱动程序中使用 SQL_HANDLE_ENV 的 HandleType,然后断开该驱动程序。然后它执行与未连接驱动程序时相同的操作。

然后驱动程序分配句柄并初始化自身。

此处全文:SQLConnect function comments

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

如果您签入 ODBC 数据源,将使用适当的驱动程序创建此 DSN (PostgreSQL30)。驱动管理器根据配置的ODBC数据源信息知道加载哪个驱动。