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