Bases de données avec ASP.net / C# et parallèle avec PHP/MySQL
Plan :
I. Introduction
II. Connexion à la base
A. Les fournisseurs de données
B. La ConnectionString
C. Exemple comparatif ASP.net/PHP
III. Effectuer un Select
A. L’objet Command
B. L’objet DataReader
C. Exemple comparatif ASP.net/PHP
IV. Update de la base
A. La méthode ExecuteNonquery()
B. Exemple comparatif ASP.net/PHP
V. Conclusion
Annexe : Installer un driver ODBC pour MySQL
I. I. Introduction
Cet article s’adresse aux développeurs débutants ayant une première expérience en XHTML, SQL et ASP.net / C#, particulièrement à ceux ayant déjà manipulé des bases de données en PHP/MySQL. Un parallèle sera fait avec ce langage, en rouge à la fin de chaque section.
Au cours d’une première partie, nous verrons une méthode permettant de se connecter à différents types de bases de données, notamment SQL Server, Access et MySQL. Les parties suivantes expliqueront comment opérer sur une base avec des requêtes SQL.
II. Connexion à la base
A. Les fournisseurs de données
ASP.net peut accéder aux différents types de bases de données grâce à un système de fournisseurs de données (data provider).
Le choix du provider dépend de nos besoins et nous l’expliciterons en utilisant un namespace approprié.
Voici les quatre data provider à connaitre, leur utilité et leur namespace :
|
Fournisseur de données
|
Domaine d’application
|
Namespace
|
|
SQL Server Provider
|
MS SQL 7.0 et supérieur
|
System.Data.SqlClient
|
|
OLE DB Provider*
|
Ex : MS Access
|
System.Data.OleDb
|
|
OBDC Provider*
|
Ex : MySQL
|
System.Data.Odbc
|
|
Oracle Provider
|
Oracle Database 8i et supérieur
|
System.Data.OracleClient
|
*Notons qu’OleDB (Object Linking and Embedding, Database) et ODBC (Open Database Connectivity) permettent d’établir une connexion avec (potentiellement) n’importe quelle base de données. Pour cela, ils sont employés en conjonction avec un driver selon le type de base utilisée. En annexe est présenté le driver ODBC MySQL pour Windows.
Les data providers ont chacun une façon différente de gérer l’accès à la base de donnée, cependant la méthode de connexion se ressemble pour tout les fournisseurs de données : on utilise la classe « Connexion ». Cette classe se présente différemment selon le provider utilisé (seul son nom change).
Ci-dessous est présentée la syntaxe différentes bases :
|
Provider
|
SQL Server
|
OleDB
|
OBDC
|
Oracle
|
|
Connexion
|
SqlConnection
|
OleDbConnection
|
ObdcConnection
|
OracleConnection
|
Exemple d’instanciation de Connection avec SQL Server :
SqlConnection myConnection = new SqlConnection() ;
B. ConnexionString
Une fois « Connection » instanciée, nous avons besoin de l’initialiser avec des paramètres tel que le mot de passe et le nom de la base. Pour cela on utilise le « ConnectionString » : un champ string de l’objet « Connection » ou l’on renseigne les paramètres de connection.
Exemple avec SQL Server :
myConnection.ConnectionString = "Data Source=localhost ; Initial Catalog=Pubs ; User ID=Dblast ; Password=Supinf0;” ;
Exemple avec ODBC et MySQL :
myConnection.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=127.0.0.1;DATABASE=maBase;UID=Dblast;PWD=Supinf0;" ;
Une autre possibilité consiste à passer un string au constructeur overloadé de l’objet connection.
Exemple avec OleDB et Access:
string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccess2007file.accdb;Persist Security Info=False; " ;
OleDbConnection myConnection = new OleDbConnection(ConnectionString) ;
Enfin, une troisième et dernière possibilité permet de stocker différentes chaines de connection dans le fichier web.config, de façon à pouvoir les utiliser par un nom (relativement) plus explicte. Il suffit d’ajouter un fils <connectionStrings> à <configuration>, dans lequel on renseigne l’élément <add> avec les champs « name » et « connectionString » :
<connectionStrings>
<add name="Mysql" connectionString="DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;DATABASE=maBase;UID=Dblast;PWD=FTW;"/>
</connectionStrings>
( note : Attention, l’élément <configSections> ne peut être précédé par <connectionStrings> ni aucun autre ! C’est l’élément racine apres <configuration> )
L’élément ainsi ajouté peut être affecté à la connection string en passant par l’objet « WebConfigurationManager » :
string ConnectionString = WebConfigurationManager.ConnectionStrings["Mysql"].ConnectionString;
Cet utilisation du fichier web.config nécessite le namespace “System.Web.Configuration“.
Pour en savoir plus sur les paramètres de ConnectionString , je vous conseille fortement d’aller sur le site : http://www.connectionstrings.com/ la référence sur le sujet. Vous pourrez y trouver tout les détails nécessaires à leur utilisation. Vous constaterez au passage la grande variété de bases de données existantes et les data providers supplémentaires (par exemple DB2 .NET pour les bases IBM).
Une fois l’objet connection instancié avec son ConnectionString, il ne reste plus qu’à exécuter sa méthode Open() tel que : myConnection.Open()
De même pour terminer la connexion, on utilise la méthode Close().
C. Exemple de synthèse et parallèle avec PHP/MySQL :
Dans cet exemple, nous nous connectons en local à une base MySQL appelée « Supinfo » avec l’utilisateur « student » et le mot de passe « ftw ». Le driver ODBC MySQL 5.1 (disponible en annexe avec sa procédure d’installation) est alors utilisé avec ASP.net.
ASP.net
1. string ConnectionString = “DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost;DATABASE=Supinfo;UID=student;PWD=ftw;”
2. OdbcConnection MyConnection = new OdbcConnection(ConenctionString);
3. myConnection.Open() ;
4. // Data retrieving
5. myConnection.Close() ;
PHP
1. $ConnectionString = mysql_connect('localhost', 'student', 'ftw');
2. mysql_select_db('Supinfo',$ConnectionString);
3. // Data retrieving
4. mysql_close($ConnectionString);
III. Effectuer un Select
Nous venons de voir l’existence d’un objet connection similaire pour chaque data provider, de la même façon il existe des objets Command et DataReader, utilisables pour récupérer des données dans la base.
Comme vous l’aurez sans doute remarqué, il faut simplement ajouter le nom du data provider utilisé pour se servir de la classe correspondante, par exemple :
OdbcCommand / SqlCommand / OleDbDataReader / OracleDataReader
Command servira à enregistrer nos requêtes alors que DataReader enregistrera les données.
A.L’objet Command
L’objet Command s’utilise avec deux attributs : Connection et CommandText. Très simplement, Connection est de type Connection et CommandText retient une requête SQL de type string. On peut affecter une valeur aux attributs dès l’instanciation grâce au constructeur overloadé de Command : Command(CommandText, Connection) .
B. L’objet DataReader
Une fois notre objet Command créé, on ajoute dans le code l’objet DataReader qui n’a pas besoin de paramètre. En effet, cet objet se contente de retenir les données (à la manière d’une ressource retourné par mysql_query() en php).
Le plus simple pour lire les données sera d’exécuter la méthode ExecuteReader() de Command, qui pour génère un objet de type DataReader. On l’utilisera dans une boucle pour récupérer les entrées des champs d’une table, grâce à sa méthode read() qui retourne une par une chaque entrée dans un tableau d’association avec les champs (comme mysql_fetch_array() en php).
C. Exemple
Dans l’exemple suivant, nous effectuons un SELECT * sur une table ‘élèves’ d’une base Supinfo, selon les cinq étapes qui suivent :
1. On affecte la requête à la variable « commandText »
2. Connexion à la base Supinfo (vue en première partie)
3. On récupère la ressource SQL dans « myCommand »
4. On boucle dans le « reader » pour afficher les entrées de la table
5. On ferme la connexion
Exemple en ASP.net :
1. string commandText = “SELECT * FROM élèves” ;
2. string ConnectionString = “DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost;DATABASE=Supinfo;UID=student;PWD=ftw;”
2. OdbcConnection myConnection = new OdbcConnection(ConenctionString) ;
2. myConnection.Open() ;
3. OdbcCommand myCommand = new OdbcCommand(commandText, myConnection) ;
4. OdbcDataReader reader ;
4. reader = myCommand.ExecuteReader();
4. while( reader.read() ) { Response.Write(“<p>” + reader[“ ID“] + “</p>”) }
5. myConnection.Close() ;
Equivalent en PHP :
1. $commandText = ‘SELECT * FROM élèves’ ;
2. $ConnectionString = mysql_connect('localhost', 'student', 'ftw');
2. mysql_select_db('Supinfo', $ConnectionString);
3. $myCommand = mysql_query($commandText) ;
4. while( $reader = mysql_fetch_array($myCommand) ) { echo ‘<p>’ . $reader[‘ID’] . ‘</p>’; }
5. mysql_close($ConnectionString);
IV. Update de la base
Il nous reste à voir comment insérer des données dans la base, ce qui ne sera pas bien long.
A. La méthode ExecuteNonquery()
Pour ce faire, nous aurons uniquement besoin de l’objet Command vue précédemment. En ajoutant une commande SQL d’update ou d’insertion à son attribut CommandText, il suffira d’exécuter la méthode ExecuteNonQuery() qui retourne un entier : utile pour savoir combien d’entrées ont étés mise à jour / insérés.
B.Comparatif ASP.net / PHP
Dans ce dernier exemple nous insérons simplement trois entrées ‘19,5’, ‘15’, ’17,5’ dans le champ note d’une table « TpASP » et nous retournons le nombre d’entrées affectées.
Exemple ASP.net :
1. string commandText = “INSERT INTO TpASP(note) VALUES (’19,5’, ‘15’, ’17,5’)” ;
2. string ConnectionString = “DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost;DATABASE=Supinfo;UID=student;PWD=ftw;”
2. OdbcConnection myConnection = new OdbcConnection(ConenctionString) ;
2. myConnection.Open() ;
3. OdbcCommand myCommand = new OdbcCommand(commandText, myConnection) ;
4. int affectedRows ; // facultative, pour afficher le nombre d’insertion
4. affectedRows = myCommand.ExecuteNonQuery() ;
4. Response.Write(“<p>“ + affectedRows.ToString() + “</p>“) ;
5. myConnection.Close() ;
équivalent PHP :
1. $commandText = ‘INSERT INTO TpASP(note) VALUES (’19,5’, ‘15’, ’17,5’)’;
2. $ConnectionString = mysql_connect('localhost', 'student', 'ftw');
2. mysql_select_db('Supinfo', $ConnectionString);
3. $myCommand = mysql_query($commandText) ;
4. echo mysql_affected_rows();
5. mysql_close($ConnectionString);
V.Conclusion
Ayant moi même développé en PHP avant d’apprendre ASP.net, les exemples des parties 2 et 3 s’appuient évidement sur MySQL. Cependant il faut garder à l’esprit que l’utilisation d’un driver (ODBC ou OleDB, au choix) ralenti la communication entre le serveur et la base. Il est donc plus judicieux d’utiliser ASP.net avec une base de donnée SQL Oracle ou Microsoft, pour ceux qui en ont la possibilité. En effet, les data provider correspondants permettent des performances plus élevés car ils accèdent directement à la base, sans passer par une couche supplémentaire.
Il faut également savoir que les classes exploitées dans ce document font parties de l’ensemble ADO.net (ActiveX Data Objects), qui fournit des méthodes d’exploitation de bases de données, mais il existe une nouvelle solution : LINQ. Sans rentrer dans les détails, LINQ permet d’envoyer des requêtes qui remplacent SQL, sns passer par un « Data Adapter ». C’est une technologie prometteuse et en plein essor.
Sources et liens :
Data Set et Data Adapter :
http://www.beansoftware.com/ASP.NET-Tutorials/DataSet-DataAdapter.aspx
Fournisseurs de données .NET Framework (ADO.NET)
http://msdn.microsoft.com/fr-fr/library/a6cd7c08.aspx
Connexion à MySQL avec C# et ODBC :
http://www.java2s.com/Code/ASP/ADO.net-Database/MySQLODBCconnectionC.htm
http://primaryobjects.com/CMS/Article68.aspx
http://dev.mysql.com/tech-resources/articles/dotnet/index.html
Connexion à Access et MSSQL :
http://www.aspfr.com/tutoriaux/ASP-BASE-DONNEES-BASES-DONNEES-ACCESS-SQL_9.aspx
LINQ avec C# et MySQL :
http://www.programmez.com/tutoriels.php?tutoriel=102&titre=Utilisation-de-LINQ-avec-la-base-MySQL
Livre : Beginning ASP.NET 3.5 in C# 2008: From Novice to Professional, Second Edition
http://apress.com/book/view/1590598911
// N’oubliez pas d’aller voir http://www.connectionstrings.com/ pour connaitre les paramètres de ConnectionString dont vous avez besoin.
Annexe : Installer un driver ODBC pour MySQL
Premièrement, nous avons besoin d’installer la dernière version du driver ODBC MySQL (5.1.6 à l’heure où j’écris ces lignes) disponible sur le site de MySQL :
http://dev.mysql.com/downloads/connector/odbc/5.1.html
Il s’agit du fichier « mysql-connector-odbc-5.1.6-win32.msi » pour windows, une rapide recherche sur google vous évitera l’inscription sur le dit site.
Une fois installé, ouvrez le panneau de configuration (outils d’administration pour Seven) puis « Sources de données (ODBC) », cliquez alors sur "ajouter".
Apres la sélection du driver, vous devrez le configurer avec un nom, une description et des identifiants.
Voilà, il ne vous reste plus qu’à utiliser une connexion string appropriée, par exemple :
connectionString="DRIVER={MySQL ODBC 5.1 Driver}; SERVER=127.0.0.1;DATABASE=maTable;UID=root;PWD=;";
Le driver est parfaitement utilisable avec PhpMyAdmin de WampServer. Comme ca, les dev PHP ne sont pas dépaysés !
d89a8766-b603-4b03-ac14-4967406af4c1|0|.0
ADO.NET, C#