Skip to content

Programmation PostgreSQL en langage C#

Introduction à l’utilisation de PostgreSQL avec C#

PostgreSQL est un système de gestion de base de données relationnelle (SGBDR) open source, puissant et extensible.

Pour interagir avec PostgreSQL en C#, deux approches principales sont couramment utilisées :

  • Npgsql : Un pilote ADO.NET natif pour PostgreSQL, idéal pour des requêtes SQL directes et un contrôle fin.
  • Entity Framework Core : Un ORM (Object-Relational Mapper) qui simplifie la manipulation des données en utilisant des objets C#.

Utilisation de Npgsql (Pilote natif)

Installation

Ajoutez le package NuGet Npgsql à votre projet:

bash
dotnet add package Npgsql

Connexion à la base de données

csharp
using Npgsql;

string connectionString = "Host=localhost;Username=postgres;Password=monmotdepasse;Database=mabasededonnees";
using var connection = new NpgsqlConnection(connectionString);
connection.Open();

TIP

Dans les exemples j'ai utilisé la forme courte de using varintroduite à partir de C# 8.0 pour simplifier la gestion des ressources qui implémentent IDisposable.

Si vous ne l'utilisez par encore elle se substitue à l'ancienne syntaxe suivante:

csharp
using (var connection = new NpgsqlConnection(connectionString))
{
    connection.Open();
    // Code utilisant connection
} // connection est automatiquement "disposé" (fermé/libéré) ici

Pour plus de lisibilité dans les exemples suivants j'utiliserais également la nouvelle syntaxe, et dans la mesure du possible je vous mettrais aussi l'ancienne syntaxe.

Exécution de requêtes SQL

Requête SELECT

csharp
using var command = new NpgsqlCommand("SELECT * FROM clients WHERE id = @id", connection);
command.Parameters.AddWithValue("@id", 1);
using var reader = command.ExecuteReader();
while (reader.Read())
{
    Console.WriteLine(reader["nom"]);
}
csharp
using (var command = new NpgsqlCommand("SELECT * FROM clients WHERE id = @id", connection))
{
    command.Parameters.AddWithValue("@id", 1);
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine(reader["nom"]);
        }
    }
}

Requête INSERT/UPDATE/DELETE

csharp
using var command = new NpgsqlCommand("INSERT INTO clients (nom, email) VALUES (@nom, @email)", connection);
command.Parameters.AddWithValue("@nom", "John Doe");
command.Parameters.AddWithValue("@email", "john.doe@example.com");
int rowsAffected = command.ExecuteNonQuery();
csharp
using (var command = new NpgsqlCommand("INSERT INTO clients (nom, email) VALUES (@nom, @email)", connection))
{
    command.Parameters.AddWithValue("@nom", "John Doe");
    command.Parameters.AddWithValue("@email", "john.doe@example.com");
    int rowsAffected = command.ExecuteNonQuery();
}

Transactions

csharp
using var transaction = connection.BeginTransaction();
try
{
    // Exécutez vos requêtes ici
    transaction.Commit();
}
catch
{
    transaction.Rollback();
}
csharp
using (var transaction = connection.BeginTransaction())
{
    try
    {
        // Exécutez vos requêtes ici
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
    }
}

Utilisation de Entity Framework Core (ORM)

Installation

Ajoutez les packages NuGet suivants:

bash
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
dotnet add package Microsoft.EntityFrameworkCore.Design

Configuration du contexte de base de données

Créez une classe AppDbContext qui hérite de DbContext:

csharp
using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public DbSet<Client> Clients { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("Host=localhost;Username=postgres;Password=monmotdepasse;Database=mabasededonnees");
    }
}

public class Client
{
    public int Id { get; set; }
    public string Nom { get; set; }
    public string Email { get; set; }
}

Migration et création de la base de données

bash
dotnet ef migrations add InitialCreate
dotnet ef database update

Opérations CRUD avec Entity Framework

Ajouter un enregistrement

csharp
using var context = new AppDbContext();
var client = new Client { Nom = "John doe", Email = "john.doe@example.com" };
context.Clients.Add(client);
context.SaveChanges();
csharp
using (var context = new AppDbContext())
{
    var client = new Client { Nom = "John doe", Email = "john.doe@example.com" };
    context.Clients.Add(client);
    context.SaveChanges();
}

Lire des enregistrements

csharp
var clients = context.Clients.Where(c => c.Nom.Contains("Doe")).ToList();
foreach (var c in clients)
{
    Console.WriteLine($"{c.Nom} - {c.Email}");
}

Mettre à jour un enregistrement

csharp
var client = context.Clients.FirstOrDefault(c => c.Id == 1);
if (client != null)
{
    client.Email = "nouvel.email@example.com";
    context.SaveChanges();
}

Supprimer un enregistrement

csharp
var client = context.Clients.FirstOrDefault(c => c.Id == 1);
if (client != null)
{
    context.Clients.Remove(client);
    context.SaveChanges();
}

Comparaison : Npgsql vs Entity Framework Core

CritèreNpgsqlEntity Framework Core
ContrôleRequêtes SQL directes, contrôle finAbstraction via ORM, moins de contrôle
ProductivitéPlus de code manuelMoins de code, plus rapide à développer
PerformanceOptimisé pour des requêtes complexesPeut générer des requêtes moins optimales
MaintenancePlus complexe à maintenirPlus facile à maintenir

Bonnes pratiques

  • Sécurité : Utilisez toujours des paramètres pour éviter les injections SQL.
  • Performance : Avec Entity Framework, évitez le ToList() inutile et utilisez AsNoTracking() pour les lectures seules.
  • Transactions : Utilisez des transactions pour garantir l’intégrité des données.

Conclusion

  • Npgsql est idéal pour des applications nécessitant un contrôle fin sur les requêtes SQL ou des optimisations spécifiques.
  • Entity Framework Core est parfait pour des applications où la productivité et la maintenance sont prioritaires.

Mise à jour le:

Publier sous CC BY-SA 4.0.