You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SQLBulkOperations C API实现PostgreSQL批量插入

PostgreSQL ODBC C API 批量插入示例代码

以下是使用ODBC C API结合SQLBulkOperations(SQL_ADD)实现批量插入1000行数据的代码,适配你的表结构(id INTEGER、name VARCHAR(50)),无需预先执行查询语句:

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>

#define BATCH_SIZE 1000
#define MAX_NAME_LEN 50

// ODBC错误检查工具函数
void check_ret(SQLRETURN ret, SQLHANDLE handle, SQLSMALLINT handle_type, const char* msg) {
    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        SQLCHAR sql_state[6], err_msg[SQL_MAX_MESSAGE_LENGTH];
        SQLINTEGER native_err;
        SQLSMALLINT msg_len;
        SQLGetDiagRec(handle_type, handle, 1, sql_state, &native_err, err_msg, sizeof(err_msg), &msg_len);
        fprintf(stderr, "%s: %s (SQL State: %s, Native Error: %ld)\n", msg, err_msg, sql_state, (long)native_err);
        exit(EXIT_FAILURE);
    }
}

int main() {
    SQLHENV env;
    SQLHDBC dbc;
    SQLHSTMT stmt;

    // 待插入的数据数组(实际业务中替换为你的数据源)
    int id[BATCH_SIZE];
    char names[BATCH_SIZE][MAX_NAME_LEN];
    for (int i = 0; i < BATCH_SIZE; i++) {
        id[i] = i + 1;
        snprintf(names[i], MAX_NAME_LEN, "User_%d", i + 1);
    }

    // 1. 初始化ODBC环境
    check_ret(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env), env, SQL_HANDLE_ENV, "分配环境句柄失败");
    check_ret(SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0), env, SQL_HANDLE_ENV, "设置ODBC版本失败");

    // 2. 分配并建立数据库连接
    check_ret(SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc), dbc, SQL_HANDLE_DBC, "分配连接句柄失败");
    // 替换为你的ODBC DSN、用户名、密码
    SQLCHAR dsn[] = "PostgreSQL_DSN";
    SQLCHAR user[] = "your_username";
    SQLCHAR pass[] = "your_password";
    check_ret(SQLConnect(dbc, dsn, SQL_NTS, user, SQL_NTS, pass, SQL_NTS), dbc, SQL_HANDLE_DBC, "数据库连接失败");

    // 3. 分配语句句柄并配置批量参数
    check_ret(SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt), stmt, SQL_HANDLE_STMT, "分配语句句柄失败");
    // 设置批量插入的行数
    check_ret(SQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)BATCH_SIZE, 0), stmt, SQL_HANDLE_STMT, "设置参数集大小失败");

    // 4. 绑定id数组到表的id列
    check_ret(SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, 
                               id, sizeof(int), NULL), 
              stmt, SQL_HANDLE_STMT, "绑定id参数失败");

    // 5. 绑定names数组到表的name列
    check_ret(SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, MAX_NAME_LEN, 0, 
                               names[0], MAX_NAME_LEN, NULL), 
              stmt, SQL_HANDLE_STMT, "绑定name参数失败");

    // 6. 执行批量插入
    check_ret(SQLBulkOperations(stmt, SQL_ADD), stmt, SQL_HANDLE_STMT, "批量插入执行失败");

    printf("成功插入 %d 行数据\n", BATCH_SIZE);

    // 7. 释放资源
    SQLFreeHandle(SQL_HANDLE_STMT, stmt);
    SQLDisconnect(dbc);
    SQLFreeHandle(SQL_HANDLE_DBC, dbc);
    SQLFreeHandle(SQL_HANDLE_ENV, env);

    return 0;
}

关键说明

  • 参数绑定:通过SQLBindParameter将数组直接绑定到表的对应列,SQL_ATTR_PARAMSET_SIZE指定批量操作的行数。
  • 驱动兼容性:确保使用的PostgreSQL ODBC驱动(psqlodbc)版本在10.0及以上,以支持SQLBulkOperations(SQL_ADD)的直接插入模式。
  • 配置替换:将代码中的PostgreSQL_DSN、your_username、your_password替换为你的实际ODBC配置信息。
  • 数据填充:代码中模拟了数据填充逻辑,实际使用时需替换为你的业务数据来源。

内容的提问来源于stack exchange,提问作者vaasu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:35:00