FAQ C#Consultez toutes les FAQ
Nombre d'auteurs : 41, nombre de questions : 274, dernière mise à jour : 27 mai 2018 Ajouter une question
Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées concernant C# sur le forum Développement DotNET
Je tiens à souligner qu'elle ne garantit en aucun cas que les informations qu'elle contient sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci .
Sur ce, je vous souhaite une bonne lecture.
Commentez cette FAQ : Commentez
- Qu'est-ce que ADO.NET ?
- Quelles classes utiliser pour me connecter à ma base de données ?
- Qu'est-ce que Sql Server Mobile 2005 ?
- Quelle chaine de connexion utiliser pour se connecter à une base de données ?
- Quelle est la différence entre les modes connecté et déconnecté ?
- Comment se connecter à une base de données ?
- Comment exécuter une requête SELECT ?
- Comment exécuter une requête non SELECT ?
- Comment exécuter une requête paramétrée ?
- Comment exécuter une requête dont le texte comprend une quote simple ?
- Comment puis-je exécuter une procédure stockée ?
- Comment écrire le contenu de ma table dans un fichier XML ?
- Comment lancer un DTS SQL Server via .NET ?
- Comment connaitre les lignes supprimées, ajoutées, modifiées d'un datagrid rempli par un dataset ?
- Comment modifier le time out d'une requête ?
- Comment créer dynamiquement une base de données Sql Mobile ?
- Comment ajouter une nouvelle ligne à un dataSet ?
- Comment modifier une ligne de mon dataSet ?
- Comment supprimer une ligne de mon dataSet ?
Cette définition est tirée de MSDN.
ADO.NET propose un accès cohérent à des sources de données telles que Microsoft SQL Server, ainsi qu'à des sources de données exposées via OLE DB et XML. Des applications grand public de partage de données peuvent utiliser ADO.NET pour se connecter à des sources de données et les extraire, les manipuler et les mettre à jour.
Le .NET Framework dispose de plusieurs providers ADO.NET permettant de se connecter à divers SGBD :
- System.Data.SqlClient pour SQL Server ;
- System.Data.SqlServerCe pour SQL Server Compact (ajouter une référence à System.Data.SqlServerCe.dll) ;
- System.Data.Odbc pour les SGBD fournissant un pilote ODBC ;
- System.Data.OleDb pour tous les SGBD ayant un fournisseur OLE DB ;
- System.Data.Oracle.Client pour Oracle (ajouter une référence à System.Data.OracleClient.dll) ;
Note : ce provider n'est plus officiellement supporté par Microsoft, il est recommandé d'utiliser le provider fourni par Oracle (voir plus bas).
Pour d'autres types de base de données, il n'existe pas de provider intégré au .NET framework, il faut donc utiliser celui fourni par l'éditeur :
- Oracle.DataAcess pour ORACLE. Disponible en installant Oracle Data Provider .NET (ODP .NET) ;
- System.Data.SQLite pour SQLite. Disponible ici ;
- MySql.Data.MySqlClient pour MySQL. Disponible ici.
Cette définition est tirée de MSDN.
Microsoft SQL Server 2005 Mobile Edition (SQL Server Mobile), précédemment Microsoft SQL Server 2000 Édition Windows CE 2.0 (SQL Server CE), étend les solutions d'entreprise de Microsoft aux applications sectorielles et de gestion d'informations personnelles sur un appareil, tout en offrant aux développeurs un modèle de programmation cohérent pour développer rapidement des applications. SQL Server Mobile offre des fonctionnalités de base de données relationnelle, tout en conservant une taille compacte : une banque de données fiable, un processeur d'optimisation des requêtes et des possibilités de connectivité fiables et évolutives.
Visitez le site regroupant la liste des chaines de connexion des différents SGBD : http://www.connectionstrings.com/
Mode connecté
Ce mode permet à un client de se connecter à un serveur de base de données et tant que le client ne fermera pas la connexion, le serveur se souviendra de lui. Lorsque l'on désirera récupérer des informations (SELECT), on les recevra au compte-gouttes, c'est-à-dire une par une.
Mode déconnecté
Le but de ce mode est de récupérer en un bloc une portion de la base de données afin d'effectuer des traitements en local sur la machine du client. On aura donc une ouverture de connexion à la base de données, la récupération en un seul bloc du résultat puis la fermeture de la connexion.
Voici un exemple pour SQL Server
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | using System.Data.SqlClient; class adobasic { [STAThread] static void Main(string[] args) { try { // Chaine de connexion string connectString = "database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"; // Objet connection SqlConnection connection = new SqlConnection(connectString); // Ouverture connection.Open(); // Fermeture connection.Close(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } } } |
On utilise les objets Command et DataReader.
Exemple avec SQL Server :
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | // chaine de connexion string connectString = "database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"; // Objet connection SqlConnection connection = new SqlConnection(connectString); // Ouverture connection.Open(); // Objet Command SqlCommand command = new SqlCommand("SELECT * FROM usr_contract", connection); // Objet DataReader SqlDataReader reader = command.ExecuteReader(); Object[] row = null; while (reader.Read()) { if (row == null) row = new Object[reader.FieldCount]; reader.GetValues(row); for (int i = 0; i < row.GetLength(0); i++) { if (row[i] != DBNull.Value) Console.Write(row[i]); else Console.Write("NULL"); if (i < row.GetUpperBound(0)) Console.Write("|"); } Console.WriteLine(); } // Fermeture reader reader.Close(); // Fermeture connection connection.Close(); |
On utilise la méthode ExecuteNonQuery de l'objet Command.
Exemple avec SQL Server
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | // chaine de connexion string connectString = "database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"; // Objet connection SqlConnection connection = new SqlConnection(connectString); // Ouverture connection.Open(); // Objet Command SqlCommand command = new SqlCommand("UPDATE usr_contract set ctr_n = ctr_n + 1", connection); // Execution int affectedrows = command.ExecuteNonQuery(); Console.WriteLine("Nombre de lignes affectées {0}", affectedrows); // Fermeture connection connection.Close(); |
Il est possible de passer des paramètres à des requêtes SQL.
Exemple avec SQL Server :
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | using System.Data.SqlClient; using System.Data; // ... // chaine de connexion string connectString = "database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"; // Objet connection SqlConnection connection = new SqlConnection(connectString); // Ouverture connection.Open(); // Objet Command SqlCommand command = new SqlCommand("SELECT * FROM usr_contract WHERE " + "ctr_ref = @contract AND ctr_exg_ref = @exg", connection); // Paramètres command.Parameters.Add(new SqlParameter("@contract", SqlDbType.VarChar, 5)); command.Parameters["@contract"].Value = "FTE"; command.Parameters.Add(new SqlParameter("@exg", SqlDbType.VarChar, 8)); command.Parameters["@exg"].Value = "SBF"; // Object datareader SqlDataReader reader = command.ExecuteReader(); Object[] row = null; while (reader.Read()) { if (row == null) row = new Object[reader.FieldCount]; reader.GetValues(row); for (int i = 0; i < row.GetLength(0); i++) { if (row[i] != DBNull.Value) Console.Write(row[i]); else Console.Write("NULL"); if (i < row.GetUpperBound(0)) Console.Write("|"); } Console.WriteLine(); } // Fermeture reader reader.Close(); // Fermeture base connection.Close(); |
Pour exécuter une requête contenant une quote simple, il faut utiliser les requêtes paramétrées
On peut aussi faire plus simple en doublant les quotes avant d'exécuter la requête.
Code c# : | Sélectionner tout |
1 2 3 4 | string sql = "SELECT * FROM pasta WHERE name = 'aujourd''hui'"; // Ou string name = "aujourd'hui"; sql = "SELECT * FROM pasta WHERE name = " + name.Replace("'", "''"); |
Pour pouvoir exécuter une procédure stockée, vous devez utiliser un objet SqlCommand et indiquer à sa propriété CommandType que vous désirez utiliser une procédure stockée
Code c# : | Sélectionner tout |
1 2 3 4 5 6 | // Objet SqlCommand SqlCommand cmd = new SqlCommand(); // On indique que l'on souhaite utiliser une procédure stockée cmd.CommandType = CommandType.StoredProcedure; // On donne le nom de cette procédure stockée cmd.CommandText = "CustOrderHist"; |
En utilisant un DataSet et sa méthode WriteXml, vous avez la possibilité d'écrire le contenu d'une table dans un fichier XML.
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class EcrireXML { public static void Main() { // Création de la chaine de connexion string _ConnectionString = "Server=Srv1;Database=Northwind;User ID=sa;Password=asdasd"; // Création de la connexion SqlConnection _SqlConnection = new SqlConnection(); _SqlConnection.ConnectionString = _ConnectionString; // Création du SqlDataAdapter SqlDataAdapter da = new SqlDataAdapter("Select * from Customers", _SqlConnection); // Création d'un DataSet DataSet ds = new DataSet(); // Remplissage du DataSet avec le SqlDataAdapter da.Fill(ds, "Customers"); // Ecriture du fichier XML au moyen de la méthode WriteXml ds.WriteXml("C:\\TestXml.xml"); } } |
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" standalone="yes" ?> <NewDataSet> <myTable> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> <ContactTitle>Sales Representative</ContactTitle> <Address>Obere Str. 57</Address> <City>Berlin</City> <PostalCode>12209</PostalCode> <Country>Germany</Country> <Phone>030-0074321</Phone> <Fax>030-0076545</Fax> </myTable> </NewDataSet> |
Ce code permet d'exécuter un DTS SQL Server 2000 via une application .NET. Un import de la référence « Microsoft DTSPackage Object Library » est nécessaire.
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | using System.Runtime.InteropServices; using DTS; //... private void RunDTS(string servername , string dtsname) { Package package = new Package(); package.LoadFromSQLServer(servername ,"","", DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection, , , , dtsname); package.Execute(); } |
Ce code permet de détecter les valeurs de lignes d'un DataGrid qui ont été modifiées, supprimées ou ajoutées par l'utilisateur. On suppose ici que l'on remplit le DataGrid avec un DataSet et un SqlDataAdapter. La requête SELECT du DataAdapter contient deux champs, nous avons donc la requête du type :
Code sql : | Sélectionner tout |
SELECT Champ1, Champ2 FROM Table
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // représente une ligne de données dans un datatable // variable string pour récupérer nos résultats string ligneModif, ligneSupp, ligneAjout; // Nous allons parcourir chaque ligne de notre DataTable foreach (DataRow dr in dataSet.Tables["DataTable"].Rows) { // Selon l'état de la ligne switch (dr.RowState) { // Ligne modifiée case DataRowState.Modified: // dr[0] récupère la valeur de la première colonne // DataRowVersion.Original récupère la valeur avant la modification ligneModif += dr[0, DataRowVersion.Original] + "-" + dr[1, DataRowVersion.Original]; break; // Ligne supprimée case DataRowState.Deleted: ligneSupp += dr[0, DataRowVersion.Original] + "-" + dr[1, DataRowVersion.Original]; break; // Ligne ajouté case DataRowState.Added: ligneAjout += dr[0] + "-" + dr[1]; break; default: break; } } string result = "ligne(s) modifiée(s) : \n" + ligneModif + "\nligne(s) supprimée(s) : \n" + ligneSupp + "\nLigne(s) ajoutée(s) :\n" + ligneAjout; MessageBox.Show(result); |
Les classes xxxCommand (sous-entendu SqlCommand, OleDbCommand, etc.) possèdent la propriété CommandTimeout pour définir le temps maximum que pourra prendre la requête.
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | SqlCommand maCommand = new SqlCommand("SELECT * FROM MaTable"); // Par défaut, CommandTimeout vaut 30 secondes Console.WriteLine("Temps avant Timeout : {0}", maCommand.CommandTimeout); // Met le Timeout à 10 secondes maCommand.CommandTimeout = 10; Console.WriteLine("Temps avant Timeout : {0}", maCommand.CommandTimeout); // Permet de ne pas générer de Timeout maCommand.CommandTimeout = 0; |
Grâce à la classe SqlCeEngine, il est possible de créer une base de données dynamiquement :
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 | // Récupération du path de l'application String CheminApplication = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetCallingAssembly().GetName().CodeBase); // Concaténation du path et du fichier de base de données String CheminFichier = System.IO.Path.Combine(CheminApplication, "bd.sdf"); // Objet permettant la création d'une base de données System.Data.SqlServerCe.SqlCeEngine Engine = new System.Data.SqlServerCe.SqlCeEngine("Data Source = " + CheminFichier); Engine.CreateDatabase(); |
L'ajout d'une ligne dans un DataSet peut être réalisé à partir de plusieurs méthodes, mais nous verrons ici celle qui utilise la classe du DataSet que vous avez créé.
Pour cet exemple, nous supposerons que nous avons une table Personne contenant toutes les informations nécessaires pour constituer un carnet d'adresses.
Notre première étape consistera à créer une nouvelle ligne (DataRow) vide :
Code c# : | Sélectionner tout |
DataRow contactRow = personneDataSet.Personne.NewRow();
Une fois cette création terminée, il ne nous reste plus qu'à insérer les données de notre formulaire d'insertion dans notre nouvelle ligne (contactRow) :
Code c# : | Sélectionner tout |
1 2 3 4 5 6 | contactRow["nom"] = nomEdit.EditValue.ToString(); contactRow["prenom"] = prenomEdit.EditValue.ToString(); contactRow["mail"] = emailEdit.EditValue.ToString(); contactRow["phone"] = phoneEdit.EditValue.ToString(); contactRow["adresse"] = adressEdit.EditValue.ToString(); ... |
Enfin, il ne nous reste plus qu'à l'ajouter à notre DataSet et valider cette action :
Code c# : | Sélectionner tout |
1 2 3 4 5 | personneDataSet.Personne.Rows.Add(contactRow); // Ajoute la nouvelle ligne au DataSet courant if (personneTableAdapter.Update(personneDataSet.Personne) > 0) //Demande de mise à jour de notre table Personne MessageBox.Show("Le nouveau contact a bien été ajouté."); else MessageBox.Show("Le nouveau contact n'a pas été ajouté."); |
La modification d'une ligne dans un DataSet peut être réalisée à partir de plusieurs méthodes :
- à l'aide d'une procédure stockée
- à l'aide des fonctions du DataSet que nous avons créé.
Nous verrons ici la deuxième méthode.
Pour cet exemple, nous supposerons que nous avons une table Personne contenant toutes les informations nécessaires pour constituer un carnet d'adresses.
Notre première étape consiste à récupérer la ligne existante dans le DataSet à l'aide de l'id que nous aurons récupéré :
Code c# : | Sélectionner tout |
DataRow contactRow = personneDataSet.Personne.Rows.Find(idPersonne);
Une fois cette récupération terminée, nous pouvons modifier les données avec les nouvelles issues de notre formulaire :
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | //On signale le début de l'édition de la ligne contactRow.BeginEdit(); contactRow["nom"] = nomEdit.EditValue.ToString(); contactRow["prenom"] = prenomEdit.EditValue.ToString(); contactRow["mail"] = emailEdit.EditValue.ToString(); contactRow["phone"] = phoneEdit.EditValue.ToString(); contactRow["adresse"] = adressEdit.EditValue.ToString(); //Fin de l'édition du contactRow contactRow.EndEdit(); |
Enfin il ne reste plus qu'à mettre à jour notre DataTable avec les nouvelles valeurs de notre DataSet :
Code c# : | Sélectionner tout |
1 2 3 4 | if (personneTableAdapter.Update(personneDataSet.Personne) > 0) //Demande de mise à jour de notre table Personne MessageBox.Show("La modification du contact a bien été prise en compte."); else MessageBox.Show("La modification n'a pas pu être réalisée."); |
La suppression d'une ligne dans un DataSet peut être réalisé à partir de plusieurs méthodes :
- à l'aide d'une procédure stockée ;
- à l'aide des fonctions du DataSet que nous avons créé.
Nous verrons ici la deuxième méthode.
Pour cet exemple, nous supposerons que nous avons une table Personne contenant toutes les informations nécessaires pour constituer un carnet d'adresses.
Notre première étape consiste à récupérer la ligne existante dans le DataSet à l'aide de l'id que nous aurons récupéré :
Code c# : | Sélectionner tout |
DataRow contactRow = personneDataSet.Personne.Rows.Find(idPersonne);
Une fois cette récupération terminée, il ne reste plus qu'à la supprimer de notre DataSet :
Code c# : | Sélectionner tout |
contactRow.Delete();
Enfin nous devons mettre à jour notre DataTable :
Code c# : | Sélectionner tout |
1 2 3 4 | if (personneTableAdapter.Update(personneDataSet.Personne) > 0) contactStatus.Caption = "Le contact a bien été supprimé"; else contactStatus.Caption = "Le contact n'a pas pu être supprimé"; |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.