Wireless

Dans le précédent article, nous avons vu le fonctionnement du mode connecté. Voyons comment fonctionne le mode déconnecté. Dans ce mode, on se connecte à la base de donnée, on charge en mémoire les données qui nous intéressent (dans un dataset), puis on ferme la connexion. Le dataset est la représentation en mémoire des données de la base. On les traite (select, insert, delete…). Après le traitement, on met à jour les données en base.

Select

Faire un Select en mode connecté est facile. On crée notre connexion, comme en mode déconnecté.

string connectionString = @"Server=REVO-ONE-RL85\SQLEXPRESS;Database=NORTHWND;User Id=monid;Password=monmotdepasse;";
SqlConnection conn = new SqlConnection(connectionString);

On crée un DataAdapter et un Dataset. Le DataAdapter stocke notre requête et le Dataset contiendra le résultat de la requête.

SqlDataAdapter adapter = new SqlDataAdapter("SELECT LastName, FirstName, BirthDate FROM Employees", conn);
DataSet data = new DataSet();

On ouvre notre connexion, on alimente le Dataset puis on ferme la connexion.

try
{
    conn.Open();
    adapter.Fill(data, "Employees");
}
catch { }
finally
{
    conn.Close();
}

Nos données sont dans le Dataset, on peut les utiliser sans avoir besoin de la connexion.

foreach (DataRow row in data.Tables["Employees"].Rows)
{
    Console.WriteLine($"{row["LastName"]} {row["FirstName"]} {Convert.ToDateTime(row["BirthDate"]).ToString("dd/MM/yyyy")}");
}

Insert

Pour ajouter des données, il faut définir la commande d’insertion.

SqlCommand insertCommand = new SqlCommand("INSERT INTO Employees (LastName, FirstName, BirthDate) VALUES (@LastName, @FirstName, @BirthDate)", conn);
insertCommand.Parameters.Add("@LastName", SqlDbType.NVarChar, 30, "LastName");
insertCommand.Parameters.Add("@FirstName", SqlDbType.NVarChar, 30, "FirstName");
insertCommand.Parameters.Add("@BirthDate", SqlDbType.DateTime,0, "BirthDate");

Affecter la commande d’insertion à notre dataadapter.

adapter.InsertCommand = insertCommand;

Ensuite, on crée la ligne à ajouter dans notre table.

DataTable table = data.Tables["Employees"];
DataRow row = table.NewRow();

row["LastName"] = "Jean";
row["FirstName"] = "Pierre";
row["BirthDate"] = new DateTime(1985, 12, 1);
table.Rows.Add(row);

Puis, on met à jour la base de données

int nb = adapter.Update(table);

Update retourne le nombre de lignes modifiées.

Update

Le fonctionnement de la mise à jour est similaire à l’insertion. On crée notre commande.

SqlCommand updateCommand = new SqlCommand("Update Employees SET City=@City WHERE EmployeeID=@EmployeeID", conn);
updateCommand.Parameters.Add("@City", SqlDbType.NVarChar, 30, "City");
updateCommand.Parameters.Add("@EmployeeID", SqlDbType.Int, 4, "EmployeeID");

On affecte à notre adapter la commande.

adapter.UpdateCommand = updateCommand;

On fait quelques modifications dans nos données.

DataTable table = data.Tables["Employees"];

// on sélectionne tous les villes dont le pays est UK
var rows = table.Select("Country = 'UK'");

// on modifie la ville à Manchester
foreach (DataRow row in rows)
{
    row["City"] = "Manchester";
}

On met à jour nos données avec Update.

int nb = adapter.Update(table);

Pour chaque ligne modifiée, la requête de la commande update est exécutée.
Donc, si les lignes modifiées ont les employeID suivants 3, 5 ,10, les requêtes suivantes seront exécutées:

Update Employees SET City=Manchester WHERE EmployeeID=3;
Update Employees SET City=Manchester WHERE EmployeeID=5;
Update Employees SET City=Manchester WHERE EmployeeID=10;

La variable nb, contient 3, le nombre de lignes modifiées.

Delete

La suppression de données fonctionne comme l’insertion et la modification. On définit notre commande.

SqlCommand deleteCommand = new SqlCommand("DELETE FROM Employees WHERE EmployeeID=@EmployeeID", conn);
deleteCommand.Parameters.Add("@EmployeeID", SqlDbType.Int, 4, "EmployeeID");

On affecte à notre DataAdapter la commande de suppression.

adapter.DeleteCommand = deleteCommand;

On supprime les lignes. Dans l’exemple ci-dessous, on supprime tous les employés qui ont pour nom Toto.

DataTable table = data.Tables["Employees"];

var rows = table.Select("LastName = 'toto'");

int n = rows.Length;

for(int i =0; i < n; i++)
{
    rows[i].Delete();
}

On met à jour la base.

			
int nb = adapter.Update(table);

La variable nb contient le nombre de lignes supprimées.

L’intérêt du Dataset est qu’il permet de stocker plusieurs tables et il propose plusieurs fonctions pour sérialiser nos données. L’un des inconvénients du mode déconnecté est qu’il peut y avoir un décalage entre les données en base et les données dans notre Dataset.

Aller plus loin:
Dataset
Connected vs Disconnected

Auteur : Daniel MINKO FASSINOU

Laisser un commentaire




Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.