C#对 Npgsq数据库进行CRUD操作

作者:微信公众号:【架构师老卢】
5-1 19:46
23

概述:Npgsql 是一种流行的 .NET 数据提供程序,允许您与 PostgreSQL 数据库进行交互。这是使用 C# 执行数据库操作的有效方法。在本文中,我们将探讨如何在 .NET 应用程序中设置 Npgsql,并提供常见数据库操作的详细示例,例如 get、insert、update、upsert 和 delete。设置环境在深入研究代码之前,需要设置 .NET 项目并将其配置为使用 Npgsql。先决条件:.NET SDK(最好是最新版本).NET SDK (expetably the latest version)PostgreSQL Server 已安装并运行Visual Studio 或

Npgsql 是一种流行的 .NET 数据提供程序,允许您与 PostgreSQL 数据库进行交互。这是使用 C# 执行数据库操作的有效方法。在本文中,我们将探讨如何在 .NET 应用程序中设置 Npgsql,并提供常见数据库操作的详细示例,例如 get、insert、update、upsert 和 delete。

设置环境

在深入研究代码之前,需要设置 .NET 项目并将其配置为使用 Npgsql。

先决条件:

  1. .NET SDK(最好是最新版本).NET SDK (expetably the latest version)
  2. PostgreSQL Server 已安装并运行
  3. Visual Studio 或其他支持 .NET 开发的 IDE

配置 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"  
  }  
}

代码设置和实现

Database Helper 类

让我们创建一个封装数据库操作的帮助程序类。在这里,我们将实现 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();
    }
}

代码示例说明

  • GetDataAsync:此方法从表中检索数据。它用于执行查询。NpgsqlCommandSELECT
  • InsertDataAsync:将新数据插入到数据库中。它采用字符串参数并在 SQL 命令中使用它。INSERT
  • UpdateDataAsync:根据提供的 ID 更新现有数据。
  • UpsertDataAsync:执行更新插入操作,如果 ID 已存在,则插入新行或更新现有行。
  • DeleteDataAsync:根据 ID 删除行。

在 .NET 应用程序中使用 Npgsql 提供了一种与 PostgreSQL 数据库交互的可靠方法。上面的示例说明了基本的 CRUD 和 upsert 操作。

npgsql 实体框架核心提供程序

Npgsql 具有实体框架 (EF) Core 提供程序。它的行为与其他 EF Core 提供程序 (e.g. SQL Server) 类似。

使用 npgsql 设置 Entity Framework Core

通过向 .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 和模型

创建一个 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; }
}

使用 EF Core 重写 CRUD 操作

让我们使用 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();
        }
    }
}

解释

  • DbContext:在运行时管理实体对象,包括使用数据库中的数据填充对象、更改跟踪以及将数据持久化到数据库。ApplicationDbContext
  • CRUD 操作:类中的每个方法都演示了如何执行基本的 CRUD 操作:DataRepository
  • GetDataAsync:从表中检索所有条目。DataItems
  • InsertDataAsync:向数据库添加新内容并保存更改。DataItem
  • UpdateDataAsync:更新数据库中的现有内容并保存更改。DataItem
  • UpsertDataAsync:检查项目是否存在;如果没有,它会添加一个新项目,否则,它会更新现有项目。
  • DeleteDataAsync:按项的 ID 删除项。

此设置应提供一个可靠的框架,用于使用 Entity Framework Core 和 Npgsql 提供程序将 PostgreSQL 集成到 .NET 应用程序中。这种方法不仅提供了对直接 SQL 语句的抽象,而且还与 .NET 的生态系统,提供 LINQ 集成和自动更改跟踪等功能。

阅读排行