在C#项目中操作PostgreSQL数据库,最常用的方式是使用官方提供的Npgsql驱动,它完全兼容PostgreSQL的特性,支持连接池、异步操作、复杂数据类型等能力,能够满足绝大多数业务场景的数据库操作需求。

环境准备
首先需要在项目中引入Npgsql依赖,如果你使用的是.NET Core或者.NET 5及以上版本,可以通过NuGet包管理器安装,也可以在项目文件里添加引用:
<PackageReference Include="Npgsql" Version="7.0.0" />
安装完成后,就可以在代码里使用Npgsql提供的类库进行数据库操作了。
建立数据库连接
连接PostgreSQL需要配置正确的连接字符串,连接字符串包含服务器地址、端口、数据库名称、用户名和密码等核心信息,示例代码如下:
using Npgsql;
// 配置连接字符串,localhost为数据库服务器地址,5432是PostgreSQL默认端口,mydb是数据库名,user和password为登录凭证
string connectionString = "Host=localhost;Port=5432;Database=mydb;Username=user;Password=password";
// 创建连接对象
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
// 打开连接
connection.Open();
Console.WriteLine("数据库连接成功");
}
这里使用using语句包裹连接对象,能够在代码执行完成后自动释放连接资源,避免连接泄露。
执行增删改查操作
查询数据
查询操作可以使用NpgsqlCommand执行SQL语句,再通过NpgsqlDataReader读取返回的结果:
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
// 定义查询SQL
string sql = "SELECT id, name, age FROM users WHERE age > @minAge";
using (NpgsqlCommand command = new NpgsqlCommand(sql, connection))
{
// 添加参数,避免SQL注入
command.Parameters.AddWithValue("minAge", 18);
using (NpgsqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
string name = reader.GetString(1);
int age = reader.GetInt32(2);
Console.WriteLine($"id:{id}, 姓名:{name}, 年龄:{age}");
}
}
}
}
插入数据
插入操作同样通过NpgsqlCommand执行,使用参数化方式传递插入的值:
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
string insertSql = "INSERT INTO users (name, age) VALUES (@name, @age)";
using (NpgsqlCommand command = new NpgsqlCommand(insertSql, connection))
{
command.Parameters.AddWithValue("name", "张三");
command.Parameters.AddWithValue("age", 25);
// 执行插入,返回受影响的行数
int rows = command.ExecuteNonQuery();
Console.WriteLine($"插入成功,影响行数:{rows}");
}
}
更新和删除数据
更新和删除操作的实现方式和插入类似,只需要修改对应的SQL语句即可:
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
// 更新操作示例
string updateSql = "UPDATE users SET age = @age WHERE name = @name";
using (NpgsqlCommand command = new NpgsqlCommand(updateSql, connection))
{
command.Parameters.AddWithValue("age", 26);
command.Parameters.AddWithValue("name", "张三");
int updateRows = command.ExecuteNonQuery();
Console.WriteLine($"更新成功,影响行数:{updateRows}");
}
// 删除操作示例
string deleteSql = "DELETE FROM users WHERE id = @id";
using (NpgsqlCommand command = new NpgsqlCommand(deleteSql, connection))
{
command.Parameters.AddWithValue("id", 1);
int deleteRows = command.ExecuteNonQuery();
Console.WriteLine($"删除成功,影响行数:{deleteRows}");
}
}
事务处理
当多个数据库操作需要保持原子性时,需要使用事务,要么全部成功要么全部回滚,实现代码如下:
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
// 开启事务
using (NpgsqlTransaction transaction = connection.BeginTransaction())
{
try
{
string sql1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";
using (NpgsqlCommand command1 = new NpgsqlCommand(sql1, connection, transaction))
{
command1.ExecuteNonQuery();
}
string sql2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";
using (NpgsqlCommand command2 = new NpgsqlCommand(sql2, connection, transaction))
{
command2.ExecuteNonQuery();
}
// 提交事务
transaction.Commit();
Console.WriteLine("事务提交成功");
}
catch (Exception ex)
{
// 出现异常回滚事务
transaction.Rollback();
Console.WriteLine($"事务回滚,错误原因:{ex.Message}");
}
}
}
常见问题说明
- 连接字符串配置错误是最常见的问题,需要确认服务器地址、端口、数据库名、用户名密码是否正确,PostgreSQL默认端口是5432。
- 所有用户输入的参数都需要通过
Parameters.AddWithValue传递,不要直接拼接SQL字符串,防止SQL注入攻击。 - 如果操作的是大文本、二进制数据等类型,Npgsql也提供了对应的类型映射,可以直接使用对应的参数类型传递。
C#NpgsqlPostgreSQL数据库操作修改时间:2026-06-14 00:30:34