更新时间:2025-09-04 GMT+08:00

具体步骤

  1. 配置连接。

    1. 配置连接超时参数。

      通过SQLSetConnectAttr函数设置连接超时时间:SQL_LOGIN_TIMEOUT参数对应于libpq参数connect_timeout,用于控制客户端连接服务端超时时间,单位为秒,默认值为0,表示该参数不生效。该参数推荐配置,用户可根据实际网络情况进行配置。

      SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
    2. 关闭自动提交选项,使用事务提交或回滚。

      通过SQLSetConnectAttr函数将自动提交属性设置为SQL_AUTOCOMMIT_OFF,关闭自动提交,以便使用事务进行提交或回滚。

      SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, 0);
    3. 连接数据库。

      通过SQLConnect函数连接数据库,具体函数原型如下:

      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);

  2. 配置批量绑定参数

    1. 设置批量绑定参数。

      设置批量绑定参数数组的总行数,其中batchCount变量为预期处理的批量插入总行数。

      SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)batchCount, sizeof(batchCount));

      设置已处理的行数,其中processRows变量为已处理的批量插入行数。

      SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, (SQLPOINTER)&processRows, sizeof(processRows));
    2. 预编译语句及批量绑定。
      使用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);

  3. 执行批量插入操作

    1. 执行批量插入操作。

      使用SQLExecute函数执行预编译的SQL语句,进行批量插入操作,通过返回值retcode判断操作是否成功。

      retcode = SQLExecute(hstmt);
    2. 手动提交或回滚事务。

      retcode为SQL_SUCCESS或SQL_SUCCESS_WITH_INFO时,插入操作成功,调用SQLEndTran函数提交事务;当retcode为其他值时,插入操作失败,调用SQLEndTran函数回滚事务。

      SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT); // 提交事务
      SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_ROLLBACK); // 回滚事务
    3. 获取批量处理的行数。

      使用SQLRowCount函数获取实际插入的行数,并存储在rowsCount变量中。

      SQLRowCount(hstmt, &rowsCount);