Npgsql 是一种流行的 .NET 数据提供程序,允许您与 PostgreSQL 数据库进行交互。这是使用 C# 执行数据库操作的有效方法。在本文中,我们将探讨如何在 .NET 应用程序中设置 Npgsql,并提供常见数据库操作的详细示例,例如 get、insert、update、upsert 和 delete。
在深入研究代码之前,需要设置 .NET 项目并将其配置为使用 Npgsql。
创建新的 .NET 项目:首先在 Visual Studio 中创建新的 .NET 控制台应用或 ASP.NET 核心项目。
添加 Npgsql:需要将 Npgsql 包添加到项目中。可以通过 NuGet 包管理器执行此操作。
dotnet add package Npgsql
将连接字符串添加到您的配置文件或任何其他配置文件。它通常看起来像这样。appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Username=postgres;Password=myPassword;Database=myDatabase"
}
}
让我们创建一个封装数据库操作的帮助程序类。在这里,我们将实现 CRUD 操作的方法。
using Npgsql;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class DatabaseHelper
{
private readonly string connectionString;
public DatabaseHelper(string connectionString)
{
this.connectionString = connectionString;
}
// Get data
public async Task<List<string>> GetDataAsync()
{
var result = new List<string>();
await using var conn = new NpgsqlConnection(connectionString);
await conn.OpenAsync();
await using (var cmd = new NpgsqlCommand("SELECT * FROM data_table", conn))
await using (var reader = await cmd.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
result.Add(reader.GetString(0)); // Adjust the index based on your data schema
}
}
return result;
}
// Insert data
public async Task InsertDataAsync(string data)
{
await using var conn = new NpgsqlConnection(connectionString);
await conn.OpenAsync();
await using var cmd = new NpgsqlCommand("INSERT INTO data_table (data_column) VALUES (@data)", conn);
cmd.Parameters.AddWithValue("@data", data);
await cmd.ExecuteNonQueryAsync();
}
// Update data
public async Task UpdateDataAsync(int id, string newData)
{
await using var conn = new NpgsqlConnection(connectionString);
await conn.OpenAsync();
await using var cmd = new NpgsqlCommand("UPDATE data_table SET data_column = @data WHERE id = @id", conn);
cmd.Parameters.AddWithValue("@data", newData);
cmd.Parameters.AddWithValue("@id", id);
await cmd.ExecuteNonQueryAsync();
}
// Upsert data (Insert or Update)
public async Task UpsertDataAsync(int id, string data)
{
await using var conn = new NpgsqlConnection(connectionString);
await conn.OpenAsync();
await using var cmd = new NpgsqlCommand("INSERT INTO data_table (id, data_column) VALUES (@id, @data) ON CONFLICT (id) DO UPDATE SET data_column = EXCLUDED.data_column", conn);
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@data", data);
await cmd.ExecuteNonQueryAsync();
}
// Delete data
public async Task DeleteDataAsync(int id)
{
await using var conn = new NpgsqlConnection(connectionString);
await conn.OpenAsync();
await using var cmd = new NpgsqlCommand("DELETE FROM data_table WHERE id = @id", conn);
cmd.Parameters.AddWithValue("@id", id);
await cmd.ExecuteNonQueryAsync();
}
}
在 .NET 应用程序中使用 Npgsql 提供了一种与 PostgreSQL 数据库交互的可靠方法。上面的示例说明了基本的 CRUD 和 upsert 操作。
Npgsql 具有实体框架 (EF) Core 提供程序。它的行为与其他 EF Core 提供程序 (e.g. SQL Server) 类似。
通过向 .csproj 文件添加必要的包,确保将项目设置为将 Entity Framework Core 与 Npgsql 配合使用。
下面是一个 .csproj 设置示例。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0" />
</ItemGroup>
</Project>
创建一个 DbContext,用于管理数据库操作。在这里,我们将定义一个简单的数据模型进行演示。
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : DbContext
{
public DbSet<DataItem> DataItems { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseNpgsql("Host=localhost;Database=myDatabase;Username=postgres;Password=myPassword");
}
public class DataItem
{
public int Id { get; set; }
public string Data { get; set; }
}
让我们使用 Entity Framework Core 实现 CRUD 操作。
using System;
using System.Linq;
using System.Threading.Tasks;
public class DataRepository
{
private readonly ApplicationDbContext _context;
public DataRepository(ApplicationDbContext context)
{
_context = context;
}
// Get all data items
public async Task<IQueryable<DataItem>> GetDataAsync()
{
return _context.DataItems;
}
// Insert new data item
public async Task InsertDataAsync(DataItem dataItem)
{
await _context.DataItems.AddAsync(dataItem);
await _context.SaveChangesAsync();
}
// Update an existing data item
public async Task UpdateDataAsync(DataItem dataItem)
{
_context.DataItems.Update(dataItem);
await _context.SaveChangesAsync();
}
// Upsert data item
public async Task UpsertDataAsync(DataItem dataItem)
{
var existingItem = await _context.DataItems.FindAsync(dataItem.Id);
if (existingItem == null)
{
await _context.DataItems.AddAsync(dataItem);
}
else
{
_context.Entry(existingItem).CurrentValues.SetValues(dataItem);
}
await _context.SaveChangesAsync();
}
// Delete data item
public async Task DeleteDataAsync(int id)
{
var dataItem = await _context.DataItems.FindAsync(id);
if (dataItem != null)
{
_context.DataItems.Remove(dataItem);
await _context.SaveChangesAsync();
}
}
}
此设置应提供一个可靠的框架,用于使用 Entity Framework Core 和 Npgsql 提供程序将 PostgreSQL 集成到 .NET 应用程序中。这种方法不仅提供了对直接 SQL 语句的抽象,而且还与 .NET 的生态系统,提供 LINQ 集成和自动更改跟踪等功能。