如何使用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
相关产品推荐
相关产品推荐

