具体步骤
- 配置连接。
- 配置连接超时参数。
通过SQLSetConnectAttr函数设置连接超时时间:SQL_LOGIN_TIMEOUT参数对应于libpq参数connect_timeout,用于控制客户端连接服务端超时时间,单位为秒,默认值为0,表示该参数不生效。该参数推荐配置,用户可根据实际网络情况进行配置。
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
- 关闭自动提交选项,使用事务提交或回滚。
通过SQLSetConnectAttr函数将自动提交属性设置为SQL_AUTOCOMMIT_OFF,关闭自动提交,以便使用事务进行提交或回滚。
SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, 0);
- 连接数据库。
1 2 3 4 5 6 7
SQLRETURN SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR *ServerName, SQLSMALLINT NameLength1, SQLCHAR *UserName, SQLSMALLINT NameLength2, SQLCHAR *Authentication, SQLSMALLINT NameLength3);
指定数据源名ServerName为前置准备中的"gaussdb"时,ODBC会自动从配置文件odbc.ini中(Linux环境)或数据源管理器中(Windows环境)获取对应的连接参数。
获取到数据源后,可以通过连接句柄hdbc访问到所有有关连接数据源的信息,包括程序运行状态、事务处理状态和错误信息等,使用对应的参数连接数据库。
SQLConnect(hdbc, (SQLCHAR *)"gaussdb", SQL_NTS, (SQLCHAR *)"", 0, (SQLCHAR *)"", 0);
- 配置连接超时参数。
- 配置批量绑定参数
- 设置批量绑定参数。
设置批量绑定参数数组的总行数,其中batchCount变量为预期处理的批量插入总行数。
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)batchCount, sizeof(batchCount));
设置已处理的行数,其中processRows变量为已处理的批量插入行数。
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, (SQLPOINTER)&processRows, sizeof(processRows));
- 预编译语句及批量绑定。
使用SQLPrepare函数预编译SQL语句,同时使用SQLBindParameter函数绑定参数到预编译的SQL语句。其中:sql变量包含SQL语句字符串,SQL_NTS表示字符串以空字符结尾,ids和cols对应id和col两列的两个数组,id为INT类型,col为VARCHAR类型。
SQLPrepare(hstmt, (SQLCHAR *)sql, SQL_NTS); SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, sizeof(ids[0]), 0, &(ids[0]), 0, bufLenIds); SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 50, cols, 50, bufLenCols);
- 设置批量绑定参数。
- 执行批量插入操作
- 执行批量插入操作。
使用SQLExecute函数执行预编译的SQL语句,进行批量插入操作,通过返回值retcode判断操作是否成功。
retcode = SQLExecute(hstmt);
- 手动提交或回滚事务。
retcode为SQL_SUCCESS或SQL_SUCCESS_WITH_INFO时,插入操作成功,调用SQLEndTran函数提交事务;当retcode为其他值时,插入操作失败,调用SQLEndTran函数回滚事务。
SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT); // 提交事务 SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_ROLLBACK); // 回滚事务
- 获取批量处理的行数。
使用SQLRowCount函数获取实际插入的行数,并存储在rowsCount变量中。
SQLRowCount(hstmt, &rowsCount);
- 执行批量插入操作。