我做了一个PostgreSQL30数据源名称。我对其进行了测试,并设法通过ODBC数据源窗口管理器连接到该dsn。有一个按钮测试,它显示消息对话框,告诉我连接成功。
现在我想知道如何通过c ++代码连接到该DSN并获取一些数据。
这是我的代码,我在网上看到几个例子x并想出了这个代码
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?
我的问题是我将如何连接到DSN或C++代码并获取一些数据
事实上,ODBC 驱动程序管理器在执行 SQLConnect 调用时对 ODBC 驱动程序进行这些调用:在此阶段,它"知道"要使用的驱动程序。查看 SQLConnect 函数说明的"注释"部分:
"驱动程序管理器不会连接到驱动程序,直到应用程序调用函数(SQLConnect,SQLDriverConnect或SQLBrowseConnect(以连接到驱动程序。在此之前,驱动程序管理器使用自己的句柄并管理连接信息。当应用程序调用连接函数时,驱动程序管理器将检查驱动程序当前是否连接到指定的连接句柄:
-
如果驱动程序未连接到,驱动程序管理器将连接到驱动程序,并调用 SQLAllocHandle(句柄类型为 SQL_HANDLE_ENV(、SQLAllocHandle(句柄类型为 SQL_HANDLE_DBC(、SQLSetConnectAttr(如果应用程序指定了任何连接属性(以及驱动程序中的连接函数。驱动程序管理器返回 SQLSTATE IM006 (驱动程序的 SQLSetConnectOption 失败( 和连接函数的SQL_SUCCESS_WITH_INFO如果驱动程序返回 SQLSetConnectAttr 错误。有关详细信息,请参阅连接到数据源或驱动程序。
-
如果指定的驱动程序已连接到 ConnectionHandle,则驱动程序管理器仅调用驱动程序中的连接函数。在这种情况下,驱动程序必须确保 ConnectionHandle 的所有连接属性都保持其当前设置。
-
如果连接到其他驱动程序,驱动程序管理器将调用 SQLFreeHandle,其 HandleType 为 SQL_HANDLE_DBC,然后,如果该环境中没有其他驱动程序连接到,它将调用 SQLFreeHandle,并在连接的驱动程序中调用 HandleType 为 SQL_HANDLE_ENV,然后断开该驱动程序的连接。然后,它执行与驱动程序未连接到时相同的操作。
然后,驱动程序分配句柄并初始化自身。
全文如下: SQLConnect 函数注释
const char* szDSN = "PostgreSQL30"; // DataSourceName (config in windows
control panel)
如果签入 ODBC 数据源,将使用适当的驱动程序创建此 DSN (PostgreSQL30(。驱动程序管理器根据配置的 ODBC 数据源信息知道要加载的驱动程序。