c++ - 如何通过 C++ 连接到 ODBC DSN

标签 c++ odbc driver dsn

我做了一个PostgreSQL30的数据源名称。我对其进行了测试,并设法通过 ODBC 数据源窗口管理器连接到该 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 驱动程序进行这些调用:在此阶段,它“知道”您要使用哪个驱动程序。查看 SQLConnect 函数说明,“注释”部分:

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

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

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

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

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

此处全文:SQLConnect function comments

关于c++ - 如何通过 C++ 连接到 ODBC DSN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395666/

相关文章:

c++ - 设计最快的页面下载

r - 设置 dbGetQuery 以将 integer64 作为整数返回

c - Linux 上的 IOCTL_STORAGE_QUERY_PROPERTY 相当于什么?

c - 在没有 WdfDeviceCreateDeviceInterface 的情况下为 Windows HID 驱动程序初始化设备接口(interface)

c++ - 特殊情况下 `std::map<int, std::atomic<T>>`的线程安全

c++ - 将 QString 转换为 QJsonArray

c++ - 查找地球坐标(纬度、经度)、距离(米)和方位(角度)

c# - MySQL Connector/ODBC 5.2.2 中服务器端准备语句的问题

sql - 使用 SQL DB2 按天限制返回

perl - 使用多个驱动程序的 CGI 应用程序身份验证