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

使用dotConnectForPostgreSQL从C#实现PostgreSQL批量插入的方法咨询

使用dotConnect for PostgreSQL实现C#批量插入/复制PostgreSQL数据

dotConnect for PostgreSQL提供了多种针对大数据量的批量操作方案,完全可以满足你数十万条Excel数据插入的需求,以下是几种实用方法:

方法1:使用PgSqlBulkCopy类(对应PostgreSQL COPY命令,性能最优)

这是dotConnect专门为批量复制设计的工具,底层封装了PostgreSQL的COPY协议,是处理海量数据最快的方式。

// 假设已将Excel数据读取到DataTable dt中
using (PgSqlConnection conn = new PgSqlConnection("你的PostgreSQL连接字符串"))
{
    conn.Open();
    using (PgSqlBulkCopy bulkCopy = new PgSqlBulkCopy(conn))
    {
        // 指定目标表名(需包含模式,比如public)
        bulkCopy.DestinationTableName = "public.target_table";
        
        // 列映射:如果Excel列名和数据库表列名完全一致,可省略此步骤;否则手动映射对应关系
        bulkCopy.ColumnMappings.Add("excel_col1", "db_col1");
        bulkCopy.ColumnMappings.Add("excel_col2", "db_col2");
        bulkCopy.ColumnMappings.Add("excel_date_col", "db_date_col"); // 日期时间类型直接映射即可
        
        // 执行批量复制
        bulkCopy.WriteToServer(dt);
    }
}

说明:该方法无需手动处理日期时间类型转换,dotConnect会自动适配PostgreSQL的日期类型,避免驱动层面的类型问题。

方法2:参数化批量插入(灵活可控,适合中等数据量)

如果需要更灵活的逻辑控制,可以构造参数化的批量INSERT语句,减少数据库交互次数提升效率:

using (PgSqlConnection conn = new PgSqlConnection("你的PostgreSQL连接字符串"))
{
    conn.Open();
    using (PgSqlCommand cmd = conn.CreateCommand())
    {
        const string baseInsertSql = "INSERT INTO public.target_table(col1, col2, date_col) VALUES ";
        List<string> valueClauses = new List<string>();
        List<PgSqlParameter> parameters = new List<PgSqlParameter>();
        int batchSize = 100; // 每批次插入100条,可根据实际调整
        int paramIndex = 0;

        foreach (var excelRow in 你的Excel数据集合)
        {
            // 构造参数化的value子句
            valueClauses.Add($"(@p{paramIndex}, @p{paramIndex+1}, @p{paramIndex+2})");
            // 添加参数,日期时间直接传入DateTime对象即可
            parameters.Add(new PgSqlParameter($"@p{paramIndex}", excelRow.Col1));
            parameters.Add(new PgSqlParameter($"@p{paramIndex+1}", excelRow.Col2));
            parameters.Add(new PgSqlParameter($"@p{paramIndex+2}", excelRow.DateCol));
            
            paramIndex += 3;

            // 达到批次大小则执行插入
            if (valueClauses.Count == batchSize)
            {
                cmd.CommandText = baseInsertSql + string.Join(", ", valueClauses);
                cmd.Parameters.AddRange(parameters.ToArray());
                cmd.ExecuteNonQuery();
                
                // 重置批次数据
                valueClauses.Clear();
                parameters.Clear();
                paramIndex = 0;
            }
        }

        // 处理剩余不足一个批次的数据
        if (valueClauses.Count > 0)
        {
            cmd.CommandText = baseInsertSql + string.Join(", ", valueClauses);
            cmd.Parameters.AddRange(parameters.ToArray());
            cmd.ExecuteNonQuery();
        }
    }
}

方法3:使用DbBatchCommand批量执行命令

dotConnect支持标准的DbBatchCommand接口,可批量执行多个参数化INSERT命令:

using (PgSqlConnection conn = new PgSqlConnection("你的PostgreSQL连接字符串"))
{
    conn.Open();
    var batch = conn.CreateBatch();
    int batchSize = 100;

    foreach (var excelRow in 你的Excel数据集合)
    {
        var cmd = conn.CreateCommand();
        cmd.CommandText = "INSERT INTO public.target_table(col1, col2, date_col) VALUES (@val1, @val2, @val3)";
        cmd.Parameters.Add(new PgSqlParameter("@val1", excelRow.Col1));
        cmd.Parameters.Add(new PgSqlParameter("@val2", excelRow.Col2));
        cmd.Parameters.Add(new PgSqlParameter("@val3", excelRow.DateCol));
        
        batch.BatchCommands.Add(cmd);

        // 达到批次大小则提交
        if (batch.BatchCommands.Count == batchSize)
        {
            batch.ExecuteNonQuery();
            batch.BatchCommands.Clear();
        }
    }

    // 提交剩余命令
    if (batch.BatchCommands.Count > 0)
    {
        batch.ExecuteNonQuery();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:31:05