ADO.NET : Exploitation d’une base de données en mode déconnecté avec Visual C# et SQL Server 2000
Ce document explore les principes et l'implémentation de l'exploitation d'une base de données en mode déconnecté en utilisant ADO.NET avec Visual C# et SQL Server 2000. Le mode déconnecté permet de travailler avec une copie locale des données (un DataSet) sans maintenir une connexion constante à la base de données, offrant ainsi des avantages en termes de performance et de gestion des ressources.
Objets ADO.NET Clés Utilisés en Mode Déconnecté
Pour la manipulation de données en mode déconnecté, plusieurs objets ADO.NET sont essentiels :
SqlConnection: Gère la connexion physique à la base de données SQL Server pour les opérations ponctuelles.SqlCommand: Utilisé pour définir et exécuter des requêtes SQL ou des procédures stockées sur la base de données.SqlDataAdapter: Agit comme un pont entre unDataSetet la base de données. Il est responsable de remplir leDataSetavec les données et de mettre à jour la source de données avec les modifications effectuées dans leDataSet.SqlCommandBuilder: Un utilitaire qui génère automatiquement les commandes SQL (INSERT,UPDATE,DELETE) nécessaires pour unSqlDataAdapter, en se basant sur la commandeSELECTspécifiée.DataSet: Représente une copie en mémoire des données de la base de données. Il peut contenir une ou plusieurs tables, leurs relations et contraintes, et fonctionne indépendamment de la connexion à la base de données.DataRow: Représente une ligne unique de données dans uneDataTableau sein duDataSet.
Opérations de base de données implémentées
Nous allons illustrer la conception d'une application permettant d'effectuer les opérations suivantes sur une base de données d'étudiants en mode déconnecté :
- Consultation d’enregistrements (navigation)
- Ajout de nouveaux enregistrements
- Modification d’enregistrements existants
- Suppression d’enregistrements
- Recherche d'un enregistrement spécifique
Variables globales pour l'application
Voici les variables nécessaires au fonctionnement de l'application, déclarées de manière statique pour une accessibilité facile :
static SqlConnection MySqlConn;
static SqlCommand MySqlCmd;
static SqlDataAdapter MySqlDataAdapter;
static SqlCommandBuilder MySqlCmdBuilder;
static DataSet MyDataSet;
static string MyStrConn, MyStrSql;
static int NumEnreg, NbEnreg;
static DataRow Row, MyFindRow;
1. Connexion et chargement des données (BtnConnexion_Click)
Cette méthode gère l'établissement de la connexion à la base de données et le remplissage initial du DataSet avec les données de la table "Etudiants". Le DataSet est ensuite utilisé comme source de données locale.
private void BtnConnexion_Click(object sender, System.EventArgs e) {
MyStrConn = "Server = Localhost; Integrated Security = SSPI; initial catalog = SQLJDNotation";
MySqlConn = new SqlConnection(MyStrConn);
MyStrSql = "SELECT * FROM Etudiants";
MySqlCmd = new SqlCommand(MyStrSql, MySqlConn);
MySqlDataAdapter = new SqlDataAdapter();
MySqlDataAdapter.SelectCommand = MySqlCmd;
MySqlCmdBuilder = new SqlCommandBuilder(MySqlDataAdapter);
MyDataSet = new DataSet();
MySqlDataAdapter.Fill(MyDataSet, "Etudiants");
MyDataSet.Tables["Etudiants"].PrimaryKey = new DataColumn[]{MyDataSet.Tables["Etudiants"].Columns["NumEtudiant"]};
NbEnreg = MyDataSet.Tables["Etudiants"].Rows.Count;
NumEnreg = 0;
MessageBox.Show(NbEnreg.ToString()); }
2. Navigation entre les enregistrements
Ces méthodes permettent de parcourir les enregistrements chargés et stockés dans le DataSet, en affichant les détails de chaque étudiant dans des champs de texte de l'interface utilisateur.
Afficher le premier enregistrement (BtnPremier_Click)
private void BtnPremier_Click(object sender, System.EventArgs e) {
NumEnreg = 0;
Row = MyDataSet.Tables["Etudiants"].Rows[NumEnreg];
TxtNumEtudiant.Text = Row["NumEtudiant"].ToString();
TxtNom.Text = Row["Nom"].ToString();
TxtPrenom.Text = Row["Prénom"].ToString();
TxtDateNaiss.Text = (Row["DateNaissance"].ToString());
TxtNumNbEnreg.Text = (NumEnreg+1).ToString() + " / " + NbEnreg.ToString(); }
Afficher l'enregistrement suivant (BtnSuivant_Click)
private void BtnSuivant_Click(object sender, System.EventArgs e) {
if (NumEnreg < NbEnreg-1) {
NumEnreg++;
Row = MyDataSet.Tables["Etudiants"].Rows[NumEnreg];
TxtNumEtudiant.Text = Row["NumEtudiant"].ToString();
TxtNom.Text = Row["Nom"].ToString();
TxtPrenom.Text = Row["Prénom"].ToString();
TxtDateNaiss.Text = (Row["DateNaissance"].ToString());
TxtNumNbEnreg.Text = (NumEnreg+1).ToString() + " / " + NbEnreg.ToString(); } else {
TxtNumEtudiant.Clear();
TxtNom.Clear();
TxtPrenom.Clear();
TxtDateNaiss.Clear();
TxtNumNbEnreg.Text = (NumEnreg+1).ToString() + " / " + NbEnreg.ToString(); } }
Afficher l'enregistrement précédent (BtnPrecedent_Click)
private void BtnPrecedent_Click(object sender, System.EventArgs e) {
if (NumEnreg > 0)
NumEnreg--;
Row = MyDataSet.Tables["Etudiants"].Rows[NumEnreg];
TxtNumEtudiant.Text = Row["NumEtudiant"].ToString();
TxtNom.Text = Row["Nom"].ToString();
TxtPrenom.Text = Row["Prénom"].ToString();
TxtDateNaiss.Text = (Row["DateNaissance"].ToString());
TxtNumNbEnreg.Text = (NumEnreg+1).ToString() + " / " + NbEnreg.ToString(); }
Afficher le dernier enregistrement (BtnDernier_Click)
private void BtnDernier_Click(object sender, System.EventArgs e) {
NumEnreg = NbEnreg - 1;
Row = MyDataSet.Tables["Etudiants"].Rows[NumEnreg];
TxtNumEtudiant.Text = Row["NumEtudiant"].ToString();
TxtNom.Text = Row["Nom"].ToString();
TxtPrenom.Text = Row["Prénom"].ToString();
TxtDateNaiss.Text = (Row["DateNaissance"].ToString());
TxtNumNbEnreg.Text = (NumEnreg+1).ToString() + " / " + NbEnreg.ToString(); }
3. Ajout de nouveaux enregistrements (BtnAjouter_Click)
Cette fonction permet d'ajouter une nouvelle ligne de données au DataSet. Une vérification est effectuée pour éviter les doublons basés sur la clé primaire. Une fois la ligne ajoutée localement, la méthode Update du SqlDataAdapter est appelée pour persister ces changements dans la base de données réelle.
private void BtnAjouter_Click(object sender, System.EventArgs e) {
DataRow MyNewRow = MyDataSet.Tables["Etudiants"].NewRow();
MyNewRow["NumEtudiant"] = short.Parse(TxtNumEtudiant.Text);
MyNewRow["Nom"] = TxtNom.Text;
MyNewRow["Prénom"] = TxtPrenom.Text;
MyNewRow["DateNaissance"] = DateTime.Parse(TxtDateNaiss.Text);
//Pour éviter les doublons, vérifier que le nouveau NumEtudiant n'existe pas dans la table
MyFindRow = MyDataSet.Tables["Etudiants"].Rows.Find(MyNewRow["NumEtudiant"]);
if (MyFindRow == null) {
MyDataSet.Tables["Etudiants"].Rows.Add(MyNewRow);
MySqlDataAdapter.Update(MyDataSet, "Etudiants");
MyFindRow = MyDataSet.Tables["Etudiants"].Rows.Find(MyNewRow["NumEtudiant"]);
MessageBox.Show("L'enregistrement a été ajouté");
NbEnreg++;
NumEnreg = NbEnreg-1;
TxtNumNbEnreg.Text = (NumEnreg+1).ToString() + " / " + NbEnreg.ToString();
TxtNumEtudiant.Clear();
TxtNom.Clear();
TxtPrenom.Clear();
TxtDateNaiss.Clear(); } else
MessageBox.Show("Ce numéro existe déjà"); }
4. Modification d'enregistrements (BtnModifier_Click)
Les modifications apportées aux champs de texte sont appliquées à l'enregistrement courant dans le DataSet. Ces changements sont ensuite synchronisés avec la base de données via la méthode Update du SqlDataAdapter.
private void BtnModifier_Click(object sender, System.EventArgs e) {
MyDataSet.Tables["Etudiants"].Rows[NumEnreg]["NumEtudiant"] = short.Parse(TxtNumEtudiant.Text);
MyDataSet.Tables["Etudiants"].Rows[NumEnreg]["Nom"] = TxtNom.Text;
MyDataSet.Tables["Etudiants"].Rows[NumEnreg]["Prénom"] = TxtPrenom.Text;
MyDataSet.Tables["Etudiants"].Rows[NumEnreg]["DateNaissance"] = DateTime.Parse(TxtDateNaiss.Text);
MySqlDataAdapter.Update(MyDataSet, "Etudiants"); }
5. Suppression d'enregistrements (BtnSupprimer_Click)
Cette méthode supprime l'enregistrement actuellement sélectionné du DataSet. La suppression est marquée localement, puis la méthode Update est utilisée pour appliquer cette modification à la base de données. L'interface utilisateur est ensuite mise à jour pour refléter le nouveau nombre d'enregistrements.
private void BtnSupprimer_Click(object sender, System.EventArgs e) {
MyDataSet.Tables["Etudiants"].Rows[NumEnreg].Delete();
MySqlDataAdapter.Update(MyDataSet, "Etudiants");
NbEnreg--;
if (NumEnreg == NbEnreg)
NumEnreg--;
Row = MyDataSet.Tables["Etudiants"].Rows[NumEnreg];
TxtNumEtudiant.Text = Row["NumEtudiant"].ToString();
TxtNom.Text = Row["Nom"].ToString();
TxtPrenom.Text = Row["Prénom"].ToString();
TxtDateNaiss.Text = (Row["DateNaissance"].ToString());
TxtNumNbEnreg.Text = (NumEnreg+1).ToString() + " / " + NbEnreg.ToString(); }
6. Recherche d'un enregistrement (BtnChercher_Click)
Cette fonction permet de rechercher un enregistrement spécifique dans le DataSet en utilisant sa clé primaire (ici, NumEtudiant). Si l'enregistrement est trouvé, ses informations sont affichées dans l'interface utilisateur.
private void BtnChercher_Click(object sender, System.EventArgs e) {
MyFindRow = MyDataSet.Tables["Etudiants"].Rows.Find(short.Parse(TxtNumEtudToFind.Text));
Row = MyFindRow;
TxtNumEtudiant.Text = Row["NumEtudiant"].ToString();
TxtNom.Text = Row["Nom"].ToString();
TxtPrenom.Text = Row["Prénom"].ToString();
TxtDateNaiss.Text = (Row["DateNaissance"].ToString()); }
Foire Aux Questions (FAQ) sur le mode déconnecté ADO.NET
Qu'est-ce que le mode déconnecté dans ADO.NET ?
Le mode déconnecté permet à une application de travailler avec une copie locale des données, appelée DataSet, sans maintenir une connexion ouverte et constante à la base de données. La connexion est établie uniquement pour charger initialement les données dans le DataSet et pour synchroniser les modifications ultérieures avec la source de données.
Quels sont les avantages principaux d'utiliser le mode déconnecté ?
Les avantages clés du mode déconnecté incluent une performance améliorée grâce à la réduction des allers-retours réseau, une évolutivité accrue en libérant les ressources de la base de données, et la possibilité pour l'application de fonctionner même en cas de perte temporaire de connectivité à la base de données.
Quel est le rôle du SqlCommandBuilder dans le mode déconnecté ?
Le SqlCommandBuilder est un objet utilitaire très pratique qui génère automatiquement les commandes SQL (INSERT, UPDATE, DELETE) nécessaires pour un SqlDataAdapter. Il déduit ces commandes à partir de la seule commande SELECT fournie. Cela simplifie considérablement le développement car le programmeur n'a pas à écrire manuellement les requêtes de manipulation de données pour les opérations de base.