présentation de ADO .NET

Transcription

présentation de ADO .NET
Microsoft ADO.NET
Communication avec les bases de
données en C#
Jérôme BIABIANY - ADO .Net
1
La plate-forme .NET
• C’est un framework de développement et
d’exécution.
• .Net est basé sur le Common Language
Runtime(CLR) qui est un environnement
d'exécution qui contrôle le code .NET
• La CLR peut exécuter des programmes qui ont
été développés dans différents langages mais
compilés pour avoir comme cible .NET
Jérôme BIABIANY - ADO .Net
2
Langages de .net
•
•
•
•
•
•
C#
VB .Net
C++(Managed)
J#
JScript
Et potentiellement d’autres langages tel que :
COBOL, Perl, et Eiffel
Jérôme BIABIANY - ADO .Net
3
Historique des accès aux données
• ODBC (OpenDatabaseConnectivity)
• RDO : Nouveau modèle objet simple pour accéder
au sources de données ODBC de manière
performante.
• DAO
• OLE.DB
• ADO (ActiveX Data Object)
Jérôme BIABIANY - ADO .Net
4
ADO .NET
• Ensemble de librairies permettant la connexion et
la manipulation de sources de données diverses
(base de données, xml, fichiers plats etc..).
Jérôme BIABIANY - ADO .Net
5
Le modèle objet ADO.NET
Jérôme BIABIANY - ADO .Net
6
Data Provider
• Fournit l’ensemble des classes nécessaires pour se
connecter à une source de données d’un ou plusieurs types
précis.
• Est conforme à l’architecture ADO .NET
• Peut être issu d’un éditeur tiers
• Inconvénient : ADO .net possède donc un modèle provider
centric.
• Le SDK .Net 1.1 est livré en standard avec 4 providers :
• System.Data.Odbc, System.Data.OleDb,
System.Data.OracleClient, System.Data.SqlClient
Jérôme BIABIANY - ADO .Net
7
Exemple de stratégie pour se connecter à
une base de données Oracle
Jérôme BIABIANY - ADO .Net
8
L’objet Connection
• Permet de se connecter à une source de données .
• En natif : OleDbConnection, SqlConnection,
OracleConnection, OdbcConnection
• Ex:
String conString = «data
source=;user=scott;password=tiger»;
OracleConnection con = new OracleConnection(conString);
con.Open();
// Opérations diverses sur la base de données
con.Close();
Jérôme BIABIANY - ADO .Net
9
Mode de connexion
• ADO .NET fournit 2 modes de connexions
pour communiquer avec une base de
données :
• Le mode connecté
• Le mode déconnecté
Jérôme BIABIANY - ADO .Net
10
Mode connecté
• L’objet Command représente la requête sql
que l’on souhaite effectuer dans la base.
• L’objet DataReader lit les résultats
éventuelles issues d’une commande de type
sélection.
• 3 méthodes fondamentales de Command :
ExecuteReader, ExecuteScaler,
ExecuteNonQuery
Jérôme BIABIANY - ADO .Net
11
Requête en mode connecté
string requete1 = «insert into .. Where cond1…»;
string requete2 = «select … from .. Where cond2…»;
OracleCommand cmd = new OracleCommand(requete1);
cmd.ExecuteNonUpdate();
// 2 ème requete
cmd.CommandText = requete2;
OracleDataReader reader = cmd.ExecuteReader();
while(reader.read()){
string nom = reader.GetString(0);
int age = reader.GetInt(1)
}
Jérôme BIABIANY - ADO .Net
12
Mode déconnecté
• Avec ADO .NET il est possible de travailler
en mode déconnecté c’est à dire avoir une
représentation d’une ou plusieurs tables en
mémoire, y compris clefs, et relations.
• Possibilité de filtrer, modifier, sélectionner
ces éléments
Jérôme BIABIANY - ADO .Net
13
L’objet DataSet
• Namespace : System.Data.DataSet
• Pièce maîtresse de l’architecture déconnectée.
• Représentation en mémoire d’un ensemble
complet de données y compris les relations.
• Utilise en interne le format XML.
• Permet d’accéder, modifier, supprimer des
données.
• S’intègre directement dans des ihm grâce à des
objets fournit par le framework .NET.
Jérôme BIABIANY - ADO .Net
14
L’objet DataSet(suite)
• Permet une conversion aisée des données en
XML.
• Est sérializable.
• Possibilité de typer fortement un DataSet
• Nécessite un DataAdapter pour faire le pont avec
la base de données.
• Peut être filtré ou trié grâce au DataView
• Le DataView sert également de pont avec les ihm.
Jérôme BIABIANY - ADO .Net
15
Hiérarchie du DataSet
Jérôme BIABIANY - ADO .Net
16
Exemple avec une base SQL Server
public void afficherCadre(SqlConnection cn)
{
string requete_cadre = "SELECT emp_id, nom, prenom, service FROM
EMPLOYE WHERE statut='CADRE'";
string requete_agent = "SELECT emp_id, nom, prenom, service FROM
EMPLOYE WHERE statut='AGENT'";
SqlDataAdapter da = new SqlDataAdapter(requete_cadre, cn);
// Creation du DataSet
DataSet ds = new DataSet();
// Remplir le DataSet
da.Fill(ds, "EMP_CADRE");
Jérôme BIABIANY - ADO .Net
17
da.SelectCommand = new SqlCommand(requete_agent, cn);
da.Fill(ds, "EMP_AGENT");
// Pour chaque table
foreach(DataTable table in ds.Tables){
// Pour chaque colonne affichage du nom de la colonne
foreach(DataColumn colonne in table.Columns){
Console.Write(colonne.ColumnName + "\t|");
}
Console.WriteLine("");
// Pour chaque enregistrement
foreach(DataRow ligne in table.Rows){
for(int i = 0 ;i < table.Columns.Count; i++) {
Console.Write(ligne[i] + "\t|");
}
Console.WriteLine("");
}
}
}
Jérôme BIABIANY - ADO .Net
18
Mise à jour par DataSet
• Le contenu d’un objet DataSet peut être
modifié manuellement.
• Pour valider les modifications dans la base
de données il faut utiliser le DataAdapter et
lui affecter ses propriétés :
DeleteCommand, UpdateCommand,
InsertCommand
Par un Objet Command paramétré
Jérôme BIABIANY - ADO .Net
19
XML
• DataSet.WriteXml : Ecrit au format XML,
le contenu des données du DataSet.
• DataSet.WriteXmlSchema : Ecrit au format
XMLSchema les méta données du DataSet (
nom des tables, des colonnes, etc..).
• En plus .NET est fournit avec une intrface
riche pour utiliser le XML.
Jérôme BIABIANY - ADO .Net
20
Paramètres et procédures stockées
• L’objet Command permet d’appeler également
des procédures stockées.
• L’objet Parameter représente un paramètre pour
une requête ou une procédure stockée.
• Un objet Command possède une liste de
paramètres qui peut être éventuellement vide.
Jérôme BIABIANY - ADO .Net
21
Exemples d’appel
OracleConnection OraCon = new OracleConnection(conString);
OracleCommand OraCom = new OracleCommand("gestion.AugmenterSalaire",
OraCon);
OraCon.CommandType = CommandType.StoredProcedure;
OracleParameter pid = new OracleParameter("id_emp" , OracleType.Int32,
1655);
pid.Direction =Parameter.Direction.INPUT;
OracleParameter pval = new OracleParameter(" pourcent" , OracleType.Int32,
2);
pval.Direction =Parameter.Direction.INPUT;
OraCom.Parameters.Insert(0, pid);
OraCom.Parameters.Insert(1, pval);
OraCom.ExecuteNonQuery();
Jérôme BIABIANY - ADO .Net
22
Transaction
• ADO .net supporte la notion de transaction.
• La transaction est associé à la connexion et
à la commande utilisé.
• Le Savepoint est un point de référence à
partir duquel on doit revenir en cas
d’annulation de l’opération
Jérôme BIABIANY - ADO .Net
23
Exemple de transaction
Con.Open();
maTransaction = Con.BeginTransaction();
maCommand1.Transaction = maTransaction;
maCommand2.Transaction = maTransaction;
try{
maCommand1.ExecuteNonQuery();
maCommand2.ExecuteNonQuery();
maTransaction.Commit();
}catch(Exception e)
{
maTransaction.RollBack();
}
Jérôme BIABIANY - ADO .Net
24
Pool de Connexion
• L’ouverture et la fermeture d’une connexion avec une base
de de données est coûteuse.
• Le pool de de connexion contient un ensemble d’objet
Connection déjà prête.
• Lorsque que l’application ferme une connection en réalité,
elle est remise automatiquement dans le pool.
• .Net supporte par défaut la notion de pool de connection en
se basant sur la chaine de connexion.
Jérôme BIABIANY - ADO .Net
25
Conseils
• Choisir le bon fournisseur de données
• Garder la connexion ouverte le moins longtemps
possible.
• Préférer le DataReader au DataSet pour des accès
rapide.
• Attention au DataSet dans un environnement avec de
nombreux clients pouvant mettre à jour les données
• Utiliser des procédures stockées
Jérôme BIABIANY - ADO .Net
26
Exemple d’utilisation générique
•
•
•
•
•
•
•
•
•
•
•
•
•
•
public void GenericConnectedParametizedExample(IDbConnection cn)
{
cn.Open();
try{
string parametedRequete = "SELECT password FROM utilisateur
WHERE login = ?";
IDbCommand command = cn.CreateCommand();
command.CommandText = parametedRequete;
command.Connection = cn;
command.Prepare();
IDataParameter pm = command.CreateParameter();
pm.ParameterName = "login";
pm.Value = "toto";
pm.DbType = DbType.String ;
command.Parameters.Add(pm);
Jérôme BIABIANY - ADO .Net
27
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
IDataReader reader = command.ExecuteReader();
int nbColumn = reader.FieldCount;
for(int i=0; i<nbColumn; i++)
{
System.Console.Write(reader.GetName(i) + "\t|");
}
System.Console.WriteLine();
while (reader.Read())
{
// pour chaque colonne de l'enregistrement
for(int i=0; i<nbColumn; i++)
{ System.Console.Write(reader.GetValue(i) + "\t|");}
System.Console.WriteLine();
}
reader.Close();
}finally{
cn.Close();
}
}
Jérôme BIABIANY - ADO .Net
28
Bibliographie
• http://msdn.microsoft.com/library/enus/cpref/html/cpref_start.asp
• ADO .NET professionnel (wrox)
• Manuel de référence ADO .Net (microsoft press)
• http://jbiabiany.free.fr/ado_net.pdf
Jérôme BIABIANY - ADO .Net
29

Documents pareils