使用ODBC连接数据库
配置数据源
该步骤并不是必须的,取决于获取连接的方式,详见下文”连接数据库”章节。
编辑/etc/odbc.ini文件,加入以下内容 (根据实际情况修改数据库连接参数):
#[$DSN]定义数据源名称
[Test]
#数据源说明
Description=Test
#使用的驱动,与/etc/odbcinst.ini中的驱动名相对应
Driver=PostgreSQL
#数据库名
Database=atlasdb
#数据库所在的主机名或IP
Servername=localhost
#数据库用户名(可不填,在代码中指定即可)
UserName=atlasdb
#数据库用户密码(可不填,在代码中指定即可)
Password=atlasdb
#数据库端口
Port=5432
上述配置中该数据源的DSN为Test,可以通过isql来验证配置是否正确,执行以下命令如果显示Connected则表示连接成功:
isql -v Test
如果数据源配置中未指定用户密码,则用isql测试连接时需要指定用户密码:
isql -v Test atlasuser atlaspassword
连接数据库
获取ODBC连接
获取连接有几种方法。
方法一:通过调用SQLConnect()函数连接到数据库:
SQLHENV env; //环境句柄
SQLHDBC conn; //连接句柄
SQLRETURN ret; //返回值
/*分配环境句柄*/
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
/*设置ODBC环境属性*/
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
/*分配连接句柄*/
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
/*连接到数据源*/
ret = SQLConnect (conn, (SQLCHAR*)"DSN",SQL_NTS,(SQLCHAR*)"USER",SQL_NTS, (SQLCHAR*)"PASSWORD",SQL_NTS);
/* 如果在odbc.ini配置文件中指定了用户名和密码,则对应的参数可以传NULL*/
方法二:通过调用SQLDriverConnect()函数连接到数据库
SQLCHAR str[1024] = "";
SQLSMALLINT strl;
SQLHENV env; //环境句柄
SQLHDBC conn; //连接句柄
SQLRETURN ret; //返回值
*分配环境句柄*/
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
/*设置ODBC环境属性*/
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
/*分配连接句柄*/
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
/*连接到数据源*/
//如果使用odbc.ini中配置的数据源,则连接串中指定DSN=xxx,并补全其他未配置的参数即可。
ret = SQLDriverConnect(conn, NULL, (SQLCHAR*)"DSN=Test1;UserName=atlasdb;Password=atlasdb", SQL_NTS,tr, sizeof(str), &strl, SQL_DRIVER_COMPLETE);
//如果不使用odbc.ini中配置的数据源信息,则按照以下方式连接数据库即可:
ret = SQLDriverConnect(conn, NULL, (SQLCHAR*)"Driver=PostgreSQL;Servername=192.168.114.28;Port=5432;Database=atlasdb;UserName=atlasdb;Password=atlasdb", SQL_NTS,str, sizeof(str), &strl,SQL_DRIVER_COMPLETE);
关闭ODBC连接
关闭连接时调用SQLDisconnect()函数关闭数据库连接:
rc = SQLDisconnect(conn);
If (!SQL_SUCCEEDED(rc))
{
printf("SQLDisconnect failed");
fflush(stdout);
exit(1);
}
rc = SQLFreeHandle(SQL_HANDLE_DBC, conn);
if (!SQL_SUCCEEDED(rc))
{
printf("SQLFreeHandle failed");
fflush(stdout);
exit(1);
}
conn = NULL;
rc = SQLFreeHandle(SQL_HANDLE_ENV, env);
if (!SQL_SUCCEEDED(rc))
{
printf("SQLFreeHandle failed");
fflush(stdout);
exit(1);
}
env = NULL;
连接参数
名称 | 缩写 | 类型 | 定义 |
---|---|---|---|
Description | string | 数据源说明 | |
Servicename | string | 数据源服务主机名或IP | |
Port | int | 数据库端口 | |
Username | string | 数据库用户 | |
Password | string | 数据库用户密码 | |
UseDeclareFetch | B6 | bool | 是否使用Declare和Fetch |
Fetch | A7 | int | 批量读取的最大行数 |
Socket | A8 | int | Socket buffer size |
ReadOnly | A0 | bool | 数据库是否只读 |
MaxVarcharSize | B0 | int | Varchar的最大长度 |
KeepaliveTime | D1 | int | TCP KEEPALIVE设置:空闲时间 |
KeepaliveInterval | D2 | int | TCP KEEPALIVE设置:间隔 |
连接参数可以在连接串中指定:
ret = SQLDriverConnect(conn, NULL, (SQLCHAR*)"Driver=PostgreSQL;Servername=192.168.114.28;Port=5411;Database=atlasdb;UserName=atlasdb;Password=atlasdb;ReadOnly=Yes;Fetch=200", SQL_NTS,
str, sizeof(str), &strl,
SQL_DRIVER_COMPLETE);