mardi 23 août 2011

[.NET] Interagir avec une base de données

Je vous propose aujourd’hui de voir comment interagir avec une base de données, c’est-à-dire créer, lire, modifier et supprimer des données.
Ce tuto est valable pour la plupart des projets .NET classiques comme Windows Forms, WPF et ASP.NET. Cependant il est à noter que pour des projets de type Silverlight, vous devez créer un WebService WCF à coté pour interroger la base de données

A télécharger:

Selon le SGBD que vous souhaitez utiliser, certains composants seront à télécharger. Pour SQL Server ou SQL Server Compact, tout est intégré nativement.
Pour MySQL ou Oracle, il vous faudra télécharger des fichiers. L’intégration à Visual Studio se fait ensuite de manière automatique.
- Télécharger MySQL Connecter/Net
- Oracle Data Provider (ODP.NET)

Avant de commencer:

Intégrez la référence à votre projet. Pour ce faire, faites un clic droit sur le nom de votre projet et choisissez dans le menu contextuel « Ajouter une référence ». (Conseil: rangez en ordre alphabétique et tapez le nom du SGBD)
Une fois la référence trouvée dans la liste et ajoutée au projet, il vous faut l’indiquer dans vos pages avec la directive using.
1
2
3
4
using System.Data.SqlServer; // SQL Server
using Mysql.Data.MySqlClient; // MySQL
using Oracle.DataAccess.Client; // Oracle
using System.Data.SqlServerCe; // SQL Server Compact
Nous allons n’utiliser que des objets pour interroger la base. Ceux que je vais utiliser à la suite de ce tutoriel sont ceux prévus pour SQL Server. Voici un tableau de chaque objet avec leur équivalent pour les autres SGBD.
SQL Server MySQL Oracle SQL Server Compact Edition
SqlConnection MySqlConnection OracleConnection SqlCeConnection
SqlCommand MySqlCommand OracleCommand SqlCeCommand
SqlDataReader MySqlReader OracleReader SqlCeReader

1) Connexion à la base de données:

Pour ce cas, nous allons imaginer une application qui tente de se connecter à une base sous SQL Server. Celle-ci contiendra une liste de couleurs, identifiées par un code et un nom.
On va utiliser l’objet SqlConnection pour établir une connexion à la base de données. On envoi à cet objet la chaîne de connexion puis on tente d’établir la connexion. En cas d’erreur, on affiche un message ainsi que l’erreur retournée.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Connexion à la BDD
SqlConnection wConnexion = new SqlConnection();
wConnexion.ConnectionString = "Database=BaseDeDonnees;Data Source=localhost;User Id=root;Password=password";
// Tenter la connexion sinon afficher un message d’erreur
try
{
     wConnexion.Open();
}
catch (Exception ex)
{
     MessageBox.Show("Impossible d'ouvrir la connexion !");
     MessageBox.Show(ex.Message);
}

2.1) Lire des données:

Nous allons lister toutes nos couleurs dans un ComboBox. Dans un premier temps, nous allons instancier un objet SqlCommand, mais pas de la façon habituelle avec le mot-clé new. Celui-ci sera créé à partir de l’objet SqlConnection et va nous permettre d’exécuter une requête SQL. En second temps, on va instancier un autre objet SqlDataReader, qui sera créé cette fois-ci à partir de l’objet SqlCommand, qui va nous permettre de lire les données.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using (wConnexion)
{
     // Instancier l’objet Command
     using (SqlCommand wCommand = wConnexion.CreateCommand())
     {
          // Définition de la requête
          wCommand.CommandText = "SELECT * FROM COULEUR";
          // Lecture des résultats
          using (SqlDataReader wReader = wCommand.ExecuteReader())
          {
               // Remplir le combobox
               while (wReader.Read())
               {
                    string wItem = wReader["NOM_COULEUR"].ToString();
                    ComboBox1.Items.Add(wItem);
               }
          }
     }
}

2.2) Filtrer les résultats avec le mot WHERE:

Si vous souhaitez filtrer les résultats en utilisant le mot-clé WHERE, il suffit de passer des paramètres. On utilise la méthode Parameters.AddWithValue() de notre objet SqlCommand: le 1er terme va être remplacé par le second. Par habitude, on indique que le texte remplacé commence par @. Par exemple dans notre cas, @CODE sera remplacé par 3.
1
2
3
4
5
int codeCouleur = 3;
// Définition de la requête
wCommand.CommandText = "SELECT * FROM COULEUR WHERE CODE_COULEUR = @CODE";
wCommand.Parameters.AddWithValue("@CODE", codeCouleur);

3) Créer/Modifier/Supprimer des enregistrements:

Cette fois-ci, nous n’avons pas besoin de SqlDataReader car nous avons juste besoin d’exécuter une requête SQL qui ne retourne aucun résultat.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using (wConnexion)
{
     // Instancier l’objet Command
     using (SqlCommand wCommand = wConnexion.CreateCommand())
     {
          // Définition de la requête
          wCommand.CommandText = "INSERT INTO Couleur (Code, Nom) VALUES (@CODE, @NOM)";
          wCommand.Parameters.AddWithValue("@CODE", 1);
          wCommand.Parameters.AddWithValue("@NOM", "violet");
          // Exécution de la requête
          wCommand.ExecuteNonQuery();
     }
}
Bien entendu, vous pouvez changer la requête INSERT par une requête UPDATE ou DELETE, la façon de faire restant inchangée.
Petit conseil: faîtes un TRY CATCH afin de gérer l’exception en cas de non exécution de la requête.

Aucun commentaire:

Enregistrer un commentaire