使用ODBC连接数据库
连接数据库
获取ODBC连接
获取连接有两种方法。
1、通过调用SQLConnect()函数连接到数据库:
SQLHENV V_OD_Env; // 环境句柄
SQLHDBC V_OD_hdbc; // 连接句柄
SQLRETURN retcode; // 返回值
SQLINTEGER V_OD_erg; //调用 接口返回值
/* 1.分配环境句柄 */
V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandle\n");
exit(0);
}
/* 2.设置ODBC环境属性(版本信息)*/
SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
/* 3.分配连接句柄 */
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
/* 4.设置连接属性 */
SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_ON, 0);
/* 5. 连接数据源,这里的“userName”与“password”分别表示连接数据库的用户名和用户密码,请根据实际情况修改。
如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("")。 但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露. */
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "Test", SQL_NTS, (SQLCHAR*) "vastbase", SQL_NTS, (SQLCHAR*) "Aa@123456", SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %d\n",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Connected !\n");
2、通过调用SQLDriverConnect()函数连接到数据库:
SQLHENV V_OD_Env; // 环境句柄
SQLHDBC V_OD_hdbc; // 连接句柄
SQLRETURN retcode; // 返回值
SQLINTEGER V_OD_erg; //调用 接口返回值
/* 1.分配环境句柄 */
V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandle\n");
exit(0);
}
/* 2.设置ODBC环境属性(版本信息)*/
SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
/* 3.分配连接句柄 */
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
/* 4.设置连接属性 */
SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER) SQL_AUTOCOMMIT_ON, 0);
/* 5. 连接数据源 */
V_OD_erg = SQLDriverConnect(V_OD_hdbc, NULL, (SQLCHAR*)"Driver=GaussMPP;Servername=127.0.0.1;Port=5432;Database=postgres;UserName=vastbase;Password=Aa@123456", SQL_NTS, str, sizeof(str), &strl,SQL_DRIVER_COMPLETE);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %d\n",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Connected !\n");
关闭ODBC连接
关闭连接时调用SQLDisconnect()函数关闭数据库连接:
rc = SQLDisconnect(V_OD_hdbc);
if (!SQL_SUCCEEDED(rc))
{
printf("SQLDisconnect failed");
fflush(stdout);
exit(1);
}
rc = SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
if (!SQL_SUCCEEDED(rc))
{
printf("SQLFreeHandle failed");
fflush(stdout);
exit(1);
}
V_OD_hdbc = NULL;
rc = SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
if (!SQL_SUCCEEDED(rc))
{
printf("SQLFreeHandle failed");
fflush(stdout);
exit(1);
}
V_OD_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);