1. 技术栈说明与环境准备

本文采用.NET 6 + Npgsql 7.0技术组合,这是目前最主流的C#连接PostgreSQL的解决方案。Npgsql作为官方推荐的ADO.NET驱动,支持最新的PostgreSQL特性且性能优异。

开发环境要求:

  • Visual Studio 2022或VSCode
  • .NET 6 SDK
  • PostgreSQL 14+数据库
  • 安装Npgsql NuGet包

安装命令:

dotnet add package Npgsql

2. 基础插入操作示例

using Npgsql;
using System;

public class DataInserter
{
    // 数据库连接字符串(按实际情况修改)
    private const string ConnStr = "Host=localhost;Port=5432;Username=postgres;Password=your_pwd;Database=testdb";

    public static void InsertUser(string userName, string email)
    {
        // 创建连接对象
        using var conn = new NpgsqlConnection(ConnStr);
        
        try
        {
            // 打开数据库连接
            conn.Open();
            
            // 构造参数化SQL语句
            const string sql = @"
                INSERT INTO users (user_name, email, created_at) 
                VALUES (@name, @email, @createTime)";
            
            // 创建命令对象
            using var cmd = new NpgsqlCommand(sql, conn);
            
            // 添加参数(防止SQL注入)
            cmd.Parameters.AddWithValue("name", userName);
            cmd.Parameters.AddWithValue("email", email);
            cmd.Parameters.AddWithValue("createTime", DateTime.UtcNow);
            
            // 执行插入操作
            int affectedRows = cmd.ExecuteNonQuery();
            Console.WriteLine($"成功插入{affectedRows}条记录");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"插入失败: {ex.Message}");
        }
    }
}

3. 批量插入优化方案

当需要处理大批量数据时,推荐使用Copy命令实现高效插入:

public static void BulkInsertUsers(List<User> users)
{
    using var conn = new NpgsqlConnection(ConnStr);
    conn.Open();
    
    // 启动二进制COPY操作
    using (var writer = conn.BeginBinaryImport(
        "COPY users (user_name, email, created_at) FROM STDIN (FORMAT BINARY)"))
    {
        foreach (var user in users)
        {
            writer.StartRow();
            writer.Write(user.UserName);
            writer.Write(user.Email);
            writer.Write(DateTime.UtcNow);
        }
        writer.Complete();
    }
    Console.WriteLine($"批量插入{users.Count}条记录成功");
}

4. 典型应用场景

  • 物联网设备数据采集(每秒处理数百条传感器数据)
  • 电商订单生成系统(高并发下的订单创建)
  • 日志记录系统(异步批量写入操作日志)
  • 数据分析预处理(原始数据清洗后入库)

5. 技术方案优缺点分析

优势:

  • 原生协议支持,性能接近JDBC驱动
  • 完善的类型映射系统(支持JSONB、数组等复杂类型)
  • 连接池管理机制成熟(默认开启连接池)
  • 支持异步操作(async/await)

局限:

  • 需要手动处理连接生命周期
  • 复杂查询需要编写原生SQL
  • 二进制协议需要PostgreSQL 9.3+版本支持

6. 关键注意事项

  1. 连接管理:始终使用using语句确保连接释放
// 错误示例:未及时释放连接
var conn = new NpgsqlConnection(ConnStr);
conn.Open(); // 可能造成连接泄漏

// 正确做法
using (var conn = new NpgsqlConnection(ConnStr))
{
    conn.Open();
    // 业务代码...
}
  1. 参数化查询:必须使用AddWithValue防止注入攻击
// 危险!直接拼接字符串
var sql = $"INSERT ... VALUES ('{userInput}')";

// 安全做法
cmd.Parameters.AddWithValue("param", userInput);
  1. 类型映射:注意C#与PostgreSQL类型对应关系
// 处理PostgreSQL的UUID类型
cmd.Parameters.Add(new NpgsqlParameter("id", NpgsqlDbType.Uuid) 
    { Value = Guid.NewGuid() });
  1. 性能调优:合理设置连接池参数
// 连接字符串中添加池配置
"Pooling=true;Minimum Pool Size=5;Maximum Pool Size=100;"

7. 最佳实践总结

通过本文的示例,我们实现了从基础插入到批量优化的完整解决方案。在实际项目中建议:

  1. 封装数据库访问层,统一管理连接字符串
  2. 对高频插入操作采用批量处理机制
  3. 配合Dapper等轻量ORM简化参数处理
  4. 使用NpgsqlDataSource(7.0+推荐)优化连接管理
  5. 定期检查数据库索引和表结构设计

完整项目示例结构建议:

Project/
├── Database/
│   ├── DatabaseHelper.cs  // 连接管理
│   └── Repositories/      // 数据访问层
├── Models/
│   └── User.cs            // 实体类
└── Services/
    └── DataService.cs     // 业务逻辑层

掌握Npgsql的数据插入技巧,将使你的C#应用与PostgreSQL的协作更加高效可靠。遇到具体问题时,可参考官方文档(https://www.npgsql.org/doc/)或社区讨论获取最新解决方案。