1 Lionel Seinturier
Accès aux données dans le framework .NET
ADO.NET – Entity Framework – LINQ
Lionel Seinturier
Université Lille 1
27/3/14
2 Lionel Seinturier
Plan
1.ADO.NET
Mode connecté
Mode non connecté
2.Entity Framework
3.LINQ
ADO.NET 3 Lionel Seinturier
ADO.NET
ActiveX Data Object .NET (ADO.NET)
API d'accès (local ou distant)
à une source de données : SGBD, tableur, fichier, messagerie, …
Fonctionne selon un principe client/serveur (local ou distant)
client = le programme (C#, VB, C++, …)
serveur = la source de données
Principe
le programme ouvre une connexion
il envoie des requêtes SQL
il récupère les résultats
...
il ferme la connexion
ADO.NET 4 Lionel Seinturier
ADO.NET
ActiveX Data Object .NET (ADO.NET)
API d'interaction avec un SGBD
nombreuses utilisations
- sauvegarde de données de manière sûre
- exploration du contenu d'un SGBD
- client/serveur 3 tiers
serveur d'applications client SGBD
donnée traitement présentation
ADO.NET
ADO.NET 5 Lionel Seinturier
ADO.NET
Historique
ODBC
RDO DAO
OLE-DB
ADO
ADO.NET
C++ VB
ts langages – API COM
évolutions
unification
simplification
(+ haut niveau)
framework .NET
ADO.NET 6 Lionel Seinturier
ADO.NET
Fournisseur (provider) et connection string
Implémentation de l'API pour un type de sources de données
Un provider par type de base de données (SQL Server, MySQL, etc.)
Connection string : identifie la source de données à laquelle on se connecte
chaîne de caractères
liste de couples propriété=valeur
format dépend du provider
Exemple : "Server=...;Database=...;"
ADO.NET 7 Lionel Seinturier
ADO.NET
Utilisation
L'API ADO.NET est définie dans System.Data
1. Ouverture d'une connexion avec la base test
SqlConnection cx = new SqlConnection("Server=localhost;Database=test;");
cx.Open();
2. Envoi d'une requête SELECT
SqlCommand cmd = new SqlCommand("SELECT * FROM ages",cx);
SqlDataReader reader = cmd.ExecuteReader();
Envoi d'une requête CREATE, INSERT ou UPDATE
SqlCommand cmd =
new SqlCommand("INSERT INTO ages VALUES ('toto',12)",cx);
cmd.ExecuteNonQuery();
ADO.NET 8 Lionel Seinturier
ADO.NET
Utilisation de ADO.NET (suite)
3. Récupération du résultat
reader.Read() retourne vrai tant qu'il reste des enregistrements dans le résultat
et positionne le curseur sur l'enregistrement suivant
reader.GetString(int column) (ex. : reader.GetString(0) )
retourne la valeur de la colonne 0 de type String de lenregistrement courant
GetInt32, GetBoolean, GetByte, GetDouble, GetFloat
idem pour des colonnes de type int, boolean, byte, double ou float
while( reader.Read() ) {
String nom = reader.GetString(0);
int age = reader.GetInt32(1);
Console.WriteLine( nom + " a " + age + " ans" );
}
ADO.NET 9 Lionel Seinturier
ADO.NET
using System.Data;
using System.Data.SqlClient;
public class TestADONet {
public static void Main( String[] args ) {
SqlConnection cx =
new SqlConnection("Server=localhost;Database=test;");
cx.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM ages",cx);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
string nom = reader.GetString(0);
int age = reader.GetInt32(1);
Console.WriteLine( nom + " a " + age + " ans" );
}
cx.Close();
} }
Utilisation de ADO.NET (code complet)
ADO.NET 10 Lionel Seinturier
ADO.NET
Types de requêtes SQL
"normale"
- interprétée à chaque exécution
précompilée
- paramétrable
- préparée pour être exécutée plusieurs fois
- gérée par le programme
procédure stockée
- paramétrable
- écrite dans le langage interne du SGBD (ex SQL Server Transac-SQL)
- gérée par le SGBD
+ masque schéma base - langage propriétaire (- évolution)
+ meilleures perf - risque de mélange
+ validées par rapport schéma base logiques traitement/donnée
ADO.NET 11 Lionel Seinturier
ADO.NET
Requêtes SQL précompilées
1. Possibilité de définition de 1 ou +sieurs paramètres ! caractères ?
SqlCommand cmd = new SqlCommand
("SELECT * FROM ages WHERE nom=? AND age>?",cx);
2. Valeurs des paramètres ajoutés à la commande
cmd.Parameters.Add(new Parameter("Bob"),cx);
cmd.Parameters.Add(new Parameter(Convert.ToInt32(5)),cx);
new Parameter( string name, object value )
paramètres ajoutés dans l'ordre de leur définition dans la requête
name non significatif dans ce contexte (voir procédure stockée)
3. Exécution de la requête
SqlDataReader reader = cmd.ExecuteReader();
...
ADO.NET 12 Lionel Seinturier
ADO.NET
Procédures stockées
Exemple de procédure stockée Transact-SQL (SQL Server)
CREATE PROCEDURE [pubs].[GetRange]
@age int
AS
SELECT nom FROM ages WHERE age < @age
GO
Le code dappel de la procédure
SqlCommand cmd = new SqlCommand("GetRange",cx);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add( new Parameter("age",Convert.ToInt32(5) );
SqlDataReader reader = cmd.ExecuteReader();
...
ADO.NET 13 Lionel Seinturier
ADO.NET
déclaration du début de la transaction
validation de la transaction
Transactions
Groupes de requêtes devant être exécutés de façon indivisible
La transaction doit être
- validée (commit) ! les résultats ne sont visibles qu'à partir de ce moment
- ou annulée (rollback)
SqlCommand cmd1 = new SqlCommand("INSERT INTO ages VALUES ('Pierre',12)",cx);
SqlCommand cmd2 = new SqlCommand("UPDATE ages SET age=15 WHERE nom='Joe'",cx);
SqlTransaction trans = cx.BeginTransaction();
cmd1.Transaction = trans;
cmd2.Transaction = trans;
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
trans.Commit();
ADO.NET 14 Lionel Seinturier
ADO.NET
Transactions
Exemple
CREATE TABLE comptes (nom VARCHAR(30) PRIMARY KEY, solde FLOAT CHECK(solde>=0) );
SqlCommand cmd1, cmd2;
cmd1 = new SqlCommand("UPDATE comptes SET solde=solde+montant WHERE nom='Paul'",cx);
cmd2 = new SqlCommand("UPDATE comptes SET solde=solde-montant WHERE nom='Bob'",cx);
SqlTransaction trans = cx.BeginTransaction();
try {
cmd1.Transaction = trans;
cmd2.Transaction = trans;
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
trans.Commit();
}
catch( Exception e ) {
trans.Rollback();
}
ADO.NET 15 Lionel Seinturier
ADO.NET
Accès aux données en mode déconnecté
par défaut c/s connecté vers SGBD
+ 1 seule copie des données (SGBD)
+ mises à jour simples
connecté vs non connecté
n messages petite taille
vs 1 message grande taille
Déconnecté
pouvoir consulter/modifier les données off line
économiser les ressources réseaux (connexions moins longues)
travailler sur des données en mémoire plutôt que directement sur un SGBD
rés
eau
SELECT …
rés
eau
SELECT …
ADO.NET 16 Lionel Seinturier
ADO.NET
Accès aux données en mode déconnecté
datasets : représentation mémoire des données d'un SGBD
SGBD
Data
Adapter
DataSet
adapter.Fill(dataset)
adapter.Update(dataset)
DataAdapter : gère liaison mémoire (DataSet) – SGBD
! contient les requêtes SQL (select, update, insert) associées aux données
ADO.NET 17 Lionel Seinturier
ADO.NET
DataSet
Un DataSet contient
des DataTable données sous forme de table
- des DataColumn
- nom, type, propriétés (autoincrement, unique, readonly, maxlength, …), …
- des DataRow
- valeurs
- des DataConstraint
des DataRelation relation entre 2 DataTable
une DefaultView
Un DataSet peut être
consulté
modifié (valeurs, lignes) ! mise à jour BD lors de Update()
sauvegardé/chargé en XML
ADO.NET 18 Lionel Seinturier
ADO.NET
Exemple d'utilisation d'un DataSet
SqlConnection cx = new SqlConnection("Server=localhost;Database=pubs;");
cx.Open();
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand("SELECT * FROM comptes",cx);
DbCommandBuilder builder = new SqlCommandBuilder(adapter);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
cx.Close();
for( int i=0 ; i<dataset.Tables.Count ; i++ ) {
DataTable table = dataset.Tables[i];
DataColumnCollection columns = table.Columns;
for( int j=0 ; j<table.Rows.Count ; j++ ) {
DataRow row = table.Rows[j];
Console.WriteLine("Row "+j+": "+row["nom"]+" "+row["solde"]);
} }
ADO.NET 19 Lionel Seinturier
ADO.NET
Mise à jour d'un DataSet
Modification d'une valeur
table.Rows[0][0] = "Bill";
adapter.Update(dataset);
Ajout d'une ligne
DataRow myDataRow = table.NewRow();
myDataRow["nom"] = "John";
myDataRow["solde"] = 123;
table.Rows.Add(myDataRow);
adapter.Update(dataset);
ADO.NET 20 Lionel Seinturier
ADO.NET
DataView
Vue (pas de copie des données) sur une Datatable
séléction
tri
Mise à jour données dans la vue = maj des données dans la DataTable
DataView view = new DataView(table);
view.RowFilter = "nom='Bob'"; // sélection de(s) Bob
for( int i=0 ; i < view.Count ; i++ ) {
view.Delete(i); // suppression aussi dans la DataTable
}
view.Sort = "nom, age DESC"; // d'abord pas nom puis par age décroissant
Expression de sélection "à la SQL"
- opérateur LIKE nom LIKE '*ob*'
- fonctions sum, avg, count, min, max
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !