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.
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▲
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.
MyPersons per =
null
;
VIII-B-1. L'insertion▲
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▲
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▲
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
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
//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.