PostgreSQL et C#

Faire un CRUD (Create Read Update Delete) sur une base de données PostgreSQL avec C#

Landry Bogbé

Pour toutes ces choses apprises çà et là, il était temps pour moi d'apporter ma modeste contribution pour permettre aux novices comme je l'ai été (et je le suis d'ailleurs car on ne finit jamais d'apprendre) de mieux appréhender certains concepts dans le domaine du développement. J'espère que ce tutoriel vous sera très utile (pour ceux qui développent en Csharp et qui voudront utiliser PostgreSQL). Commentez

- Titre : PostgreSQL et C#

- Auteur : Landry Bogbé

- Parution : 25 août 2014

- Mise à jour : 10 septembre 2014

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2014 landry161. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Le projet

- III. Le langage

- IV. Le SGBD

- V. La base de données

- VI. PostgreSQL et C#

- VII. Les classes

- VIII. L'application

- VIII-A. La classe MyPersons

- VIII-B. Le code des boutons

- VIII-B-1. L'insertion

- VIII-B-2. La modification

- VIII-B-3. La suppression

- VIII-C. Les autres méthodes

- IX. Remerciements

I - Introduction

Le stockage des données n'est pas aussi aisé, car il faut trouver les moyens et des outils adéquats pour y parvenir. Parmi ces moyens, nous avons les SGBD (Systèmes de Gestion de Base de Données). Ils permettent de stocker ces données et de les fournir à l'utilisateur final quand il en a besoin. Il en existe une multitude, les uns payants (SQL Server, Oracle, etc.) et d'autres qui sont gratuits (MySQL, PostgreSQL). L'accès à ces SGBD se fait de plusieurs manières par le canal des langages de programmation. Nous aborderons plus tard l'accès à une base de données PostgreSQL.

II - Le projet

Nous nous donnons l'objectif de concevoir un répertoire dans lequel nous sauvegardons essentiellement les nom, prénom, téléphone et adresse. Cela peut paraître insignifiant mais je pense qu'il faut commencer par des projets simples pour mieux appréhender les concepts. À la fin, notre application ressemblera à cette image ci-dessous (avec des enregistrements que j'ai effectués).

III - Le langage

Pour notre application, nous utiliserons le langage C#. C'est un langage créé par Microsoft, dont on peut écrire le code avec l'éditeur Visual Studio 2010 Express, pour toutes autres informations vous pouvez vous référer à la section Forum .NET.

IV - Le SGBD

PostgreSQL est un SGBD (Système de Gestion de Base de Données) gratuit que vous pouvez télécharger sur Internet. Pour ce qui est de l'installation, il n'y a pas grand-chose, à part le mot de passe qui sera 1234 et le numéro de port qui est 5432 (pour cette application). L'administration d'une base de données PostgreSQL se fait grâce à l'outil pgAdmin. Pour d'autres informations sur PostgreSQL, vous pouvez vous rendre à la Section PostgreSQL.

V - La base de données

Notre base de données contiendra une seule table, en l'occurrence la table personne. Lancez pgAdmin, double-cliquez sur Base de données et ajoutez la base de données nommée repertoire puis validez. Après cela, nous allons créer notre table avec l'assistant, pour cela faites un clic droit sur la base en question, puis déroulez l'arborescence Schémas et faites un clic droit sur Tables, puis sélectionnez Ajouter une table. Sous l'onglet Propriétés, entrez le nom de la table personne. L'onglet colonne vous permettra de définir les colonnes de notre table comme vous le voyez ci-dessous.

En plus de l'assistant vous pouvez créer vos tables à partir de l'éditeur SQL. Pour cela, cliquez sur la loupe avec SQL écrit au milieu puis entrez le script ci-dessous.

Table Personne

CREATE TABLE "Personne"
(
id serial NOT NULL,
nom character varying(50),
prenom character varying(50),
telephone character varying(50),
adresse character varying(50)
);

VI - PostgreSQL et C#

Pour interagir avec les bases de données, les langages utilisent des bibliothèques spécifiques. Il s'agit en général de fichiers .dll. Dans le cadre du langage C#, il existe deux bibliothèques qui nous permettent cela (Npgsql.dll, Mono.Security.dll) à travers des classes. Vous trouverez ces bibliothèques sur ce lien Npgsql-1.0.1-src. Pour cela il faudra faire un clic droit sur votre projet ensuite cliquez sur Ajouter une référence et sélectionnez les deux fichiers .dll que vous trouverez dans le dossier téléchargé après décompression.

VII - Les classes

Ce tableau donne simplement les classes utilisées (il en existe d'autres) à partir de la librairie Npgsql.dll.

Classe

Intitulé

Utilisation

NpgsqlConnection

Représente une chaîne de connexion à la base de données.

NpgsqlConnection cnx = new NpgsqlConnection(Conx); //Où Conx représente les paramètres de connexion de la manière suivante Conx = "Server=localhost;Port=5432;Database=repertoire;User Id=postgres;Password=1234;"

NpgsqlCommand

Représente une commande SQL.

NpgsqlCommand MyCmd = new NpgsqlCommand(query,Conx); //Où query est notre requête SQL et Conx la chaîne de connexion. La commande est ensuite exécutée par la méthode ExecuteNonQuery()

NpgsqlParameter

Permet de définir des paramètres de la commande.

NpgsqlParameter prm = new NpgsqlParameter(nom_parametre,NpgsqlDbType); //Où nom_parametre est le paramètre entre " " et NpgsqlDbType est une énumération qui permet de définir le type du paramètre (entier, chaîne de caractères, etc.)

VIII - L'application

Ouvrez donc votre solution sous Visual Studio 2010 et nommez la solution CRUD (Create, Read, Update and Delete). Ajoutez un projet de type Application Windows Forms et une classe, puis un formulaire que vous nommerez respectivement TutoDeveloppez, MyPersons et FrmPersons. Si tout est fait normalement vous devriez voir l'explorateur de solutions se présenter de cette manière :

Comme vous le voyez l'application se déroule à deux niveaux. Nous avons la classe MyPersons dans laquelle nous avons défini les méthodes qui nous permettront d'effectuer des opérations sur notre base de données ensuite l'interface qui implémentera les méthodes de la classe MyPersons. Vous avez un extrait de la classe MyPersons ci-dessous, copiez le contenu de la classe et collez-le dans votre éditeur Visual Studio.

VIII-A - La classe MyPersons

Classe MyPersons

using System;
using System.Collections.Generic;

//On inclue la librairie
using Npgsql;
using NpgsqlTypes;
//Fin
using System.Linq;
using System.Data;
using System.Text;

namespace TutoDeveloppez
{
//Réalisé par José Landry BOGBE le 09/07/2014 a 10 heures 39 minutes
public class MyPersons
{
string Conx = "Server=localhost;Port=5432;Database=repertoire;User Id=postgres;Password=1234;";
NpgsqlCommand MyCmd = null;
NpgsqlConnection MyCnx = null;

public void InsertPersons(string nom, string prenom, string tel, string adresse)
{
MyCnx = new NpgsqlConnection(Conx);
string insert = "INSERT INTO \"personne\"(id,nom,prenom,telephone,adresse) values(DEFAULT,:nom,:prenom,:tel,:adresse)";
//La valeur DEFAULT parce que la propriété id est auto incrémenté
MyCnx.Open();
MyCmd = new NpgsqlCommand(insert, MyCnx);

//Définition  et ajout des paramètres

MyCmd.Parameters.Add(new NpgsqlParameter("nom", NpgsqlDbType.Varchar)).Value = nom;
MyCmd.Parameters.Add(new NpgsqlParameter("prenom", NpgsqlDbType.Varchar)).Value = prenom;
MyCmd.Parameters.Add(new NpgsqlParameter("tel", NpgsqlDbType.Varchar)).Value = tel;
MyCmd.Parameters.Add(new NpgsqlParameter("adresse", NpgsqlDbType.Varchar)).Value = adresse;

MyCmd.ExecuteNonQuery(); //Exécution
MyCnx.Close();
}

public void UpdatePersons(int id, string nom, string prenom, string tel, string adresse)
{
MyCnx = new NpgsqlConnection(Conx); //Instanciation
string update = "UPDATE  \"personne\"  SET nom =:pnom ,prenom=:pprenom,telephone=:ptel,adresse=:padresse WHERE(id=:pid);";
MyCnx.Open();

MyCmd = new NpgsqlCommand(update, MyCnx);

//Définition  et ajout des paramètres
MyCmd.Parameters.Add(new NpgsqlParameter("pid", NpgsqlDbType.Varchar)).Value =id;
MyCmd.Parameters.Add(new NpgsqlParameter("pnom", NpgsqlDbType.Varchar)).Value = nom;
MyCmd.Parameters.Add(new NpgsqlParameter("pprenom", NpgsqlDbType.Varchar)).Value = prenom;
MyCmd.Parameters.Add(new NpgsqlParameter("ptel", NpgsqlDbType.Varchar)).Value = tel;
MyCmd.Parameters.Add(new NpgsqlParameter("padresse", NpgsqlDbType.Varchar)).Value = adresse;

MyCmd.ExecuteNonQuery();//Exécution
MyCnx.Close();
}

public DataTable SelectAllPerson()
{
DataTable MyData = new DataTable();
NpgsqlDataAdapter da;
MyCnx = new NpgsqlConnection(Conx);
MyCnx.Open();
string select = "SELECT * FROM \"personne\"";
MyCmd = new NpgsqlCommand(select, MyCnx);
da = new NpgsqlDataAdapter(MyCmd);
da.Fill(MyData);
MyCnx.Close();
return MyData;
}

public void DeletePersonneById(int idpersonne)
{
MyCnx = new NpgsqlConnection(Conx);
string delete = "DELETE FROM \"personne\" WHERE(id=:pid)";

MyCnx.Open();
MyCmd = new NpgsqlCommand(delete, MyCnx);
MyCmd.Parameters.Add(new NpgsqlParameter("pid", NpgsqlDbType.Integer)).Value =idpersonne;
MyCmd.ExecuteNonQuery();
MyCnx.Close();
}
}
}//Fin

VIII-B - Le code des boutons

Ici nous sommes du côté interface et nous y écrirons nos bouts de code grâce auxquels nous effectuerons les opérations de base. Mais avant, il faudrait instancier un objet de la classe MyPersons dont le code est ci-dessous.

Instanciation

MyPersons per = null;

VIII-B-1 - L'insertion

Insertion Personne

private void btnInsert_Click(object sender, EventArgs e)
{
per = new MyPersons(); //Instaciation
//Appel de la méthode InsertPsersons créee dans
per.InsertPersons(txtNom.Text, txtPrenom.Text, txtTel.Text, txtAdresse.Text);
DeleteFields(); //Suppression des champs après insertion
LoadDataBase(); //Rafraichissement du datagridview
}

VIII-B-2 - La modification

Update Personne

private void btnUpdate_Click(object sender, EventArgs e)
{
per = new MyPersons();
try
{
//On teste le contenu de notre variable IdPersons
if (IdPersons != 0)
{
per.UpdatePersons(IdPersons, txtNom.Text, txtPrenom.Text, txtTel.Text, txtAdresse.Text);
DeleteFields();
LoadDataBase();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

VIII-B-3 - La suppression

Delete Personne

private void btnDelete_Click(object sender, EventArgs e)
{
per = new MyPersons();
try
{
//On teste le contenu de notre variable IdPersons
if (IdPersons != 0)
{
per.DeletePersonneById(IdPersons);
//Efface le contenu des champs
DeleteFields();
LoadDataBase();
}
}
catch (Exception ex)
{
MessageBox.Show("Erreur " + ex);
}
}

VIII-C - Les autres méthodes

- Le rafraîchissement de la liste

Refresh

public void LoadDataBase()
{
per = new MyPersons();
SelectPersons.DataSource = per.SelectAllPerson();
}

private void FrmPersons_Load(object sender, EventArgs e)
{
LoadDataBase(); //Appelé pendant le chargement du formulaire
}

- La suppression du contenu des champs

Suppression des champs

//Procède à la suppression des champs
public void DeleteFields()
{
this.txtNom.Clear();
this.txtPrenom.Clear();
this.txtTel.Clear();
this.txtAdresse.Clear();
}

IX - Remerciements

Je voudrais remercier du fond du cœur f-leb, Lana-Bauer, gorgonite, jacques_jean, djibril et bien d'autres pour l'aide, les critiques et la correction. Et j'espère que ce tutoriel sera le premier d'une longue série.