连接到数据库
在任何 ODBC 应用程序中,第一步总是连接到数据库。创建与使用 ODBC 的数据源的连接时,应使用 DSN(其中包含要使用的驱动程序的详细信息、数据库主机和有关连接到数据源的其他基本信息)的名称。
若要连接到数据库,您需要对应用程序执行以下 4 个步骤:
-
调用
SQLAllocHandle()
来为 ODBC 环境分配句柄。此句柄用于创建连接对象和设置应用程序范围设置。 -
使用环境句柄设置应用程序要使用的 ODBC 版本。这样可确保数据源知道应用程序将使用哪个 API 与其交互。
-
通过调用
SQLAllocHandle()
来分配数据库连接句柄。此句柄代表与特定数据源的连接。 -
使用
SQLConnect()
或SQLDriverConnect()
函数打开与数据库的连接。注意
如果在连接字符串或 DSN 中指定区域设置,调用连接函数将返回有关成功连接的 SQL_SUCCESS_WITH_INFO,并显示有关区域设置状态的消息。
创建与数据库的连接时,如果在连接时只需要设置用户名和密码选项,请使用 SQLConnect()
。如果要更改诸如区域设置等选项,请使用 SQLDriverConnect()
。
以下示例演示了使用名为 ExampleDB 的 DSN 连接到数据库。成功创建连接后,此示例仅关闭该连接。
// Demonstrate connecting to Vertica using ODBC.
// Standard i/o library
#include <stdio.h>
#include <stdlib.h>
// Only needed for Windows clients
// #include <windows.h>
// SQL include files that define data types and ODBC API
// functions
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
int main()
{
SQLRETURN ret; // Stores return value from ODBC API calls
SQLHENV hdlEnv; // Handle for the SQL environment object
// Allocate an a SQL environment object
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hdlEnv);
if(!SQL_SUCCEEDED(ret)) {
printf("Could not allocate a handle.\n");
exit(EXIT_FAILURE);
} else {
printf("Allocated an environment handle.\n");
}
// Set the ODBC version we are going to use to
// 3.
ret = SQLSetEnvAttr(hdlEnv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER);
if(!SQL_SUCCEEDED(ret)) {
printf("Could not set application version to ODBC 3.\n");
exit(EXIT_FAILURE);
} else {
printf("Set application version to ODBC 3.\n");
}
// Allocate a database handle.
SQLHDBC hdlDbc;
ret = SQLAllocHandle(SQL_HANDLE_DBC, hdlEnv, &hdlDbc);
if(!SQL_SUCCEEDED(ret)) {
printf("Could not allocate database handle.\n");
exit(EXIT_FAILURE);
} else {
printf("Allocated Database handle.\n");
}
// Connect to the database using
// SQL Connect
printf("Connecting to database.\n");
const char *dsnName = "ExampleDB";
const char* userID = "ExampleUser";
const char* passwd = "password123";
ret = SQLConnect(hdlDbc, (SQLCHAR*)dsnName,
SQL_NTS,(SQLCHAR*)userID,SQL_NTS,
(SQLCHAR*)passwd, SQL_NTS);
if(!SQL_SUCCEEDED(ret)) {
printf("Could not connect to database.\n");
exit(EXIT_FAILURE);
} else {
printf("Connected to database.\n");
}
// We're connected. You can do real
// work here
// When done, free all of the handles to close them
// in an orderly fashion.
printf("Disconnecting and freeing handles.\n");
ret = SQLDisconnect( hdlDbc );
if(!SQL_SUCCEEDED(ret)) {
printf("Error disconnecting from database. Transaction still open?\n");
exit(EXIT_FAILURE);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdlDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hdlEnv);
exit(EXIT_SUCCESS);
}
运行以上代码后,将输出以下内容:
Allocated an environment handle.
Set application version to ODBC 3.
Allocated Database handle.
Connecting to database.
Connected to database.
Disconnecting and freeing handles.
有关使用 SQLDriverConnect 连接到数据库的示例,请参阅设置 ODBC 会话的区域设置和编码。
注意
-
如果您使用 DataDirect® 驱动程序管理器,则应在连接到 Vertica 时始终对 SQLDriverConnect 函数的 DriverCompletion 参数(函数调用中的最终参数)使用 SQL_DRIVER_NOPROMPT 值。Linux 和 UNIX 平台上 Vertica 的 ODBC 驱动程序不包含 UI,因此无法提示用户输入密码。
-
在 Windows 客户端平台上,ODBC 驱动程序会提示用户提供连接信息。有关详细信息,请参阅提示 Windows 用户提供缺少的连接属性。
-
如果数据库不符合 Vertica 许可协议,应用程序将在
SQLConnect()
函数的返回值中收到警告消息。始终应让应用程序检查此返回值是否为 SQL_SUCCESS_WITH_INFO。如果是,应让应用程序提取消息并向用户显示。