FAQ C#Consultez toutes les FAQ

Nombre d'auteurs : 41, nombre de questions : 272, dernière mise à jour : 16 août 2017  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


SommaireFichiers et donnéesBases de données (ADO.NET) (19)
précédent sommaire suivant
 

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.

Mis à jour le 2 janvier 2007 Jérôme Lambert

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 :

Mis à jour le 2 novembre 2004 abelman tomlev

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.

Mis à jour le 2 janvier 2007 Jérôme Lambert

Visitez le site regroupant la liste des chaines de connexion des différents SGBD : http://www.connectionstrings.com/

Mis à jour le 2 janvier 2007 Jérôme Lambert

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.

Mis à jour le 2 janvier 2007 Jérôme Lambert

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()); 
        } 
    } 
}

Mis à jour le 2 novembre 2004 abelman

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();
Consulter les cours sur ADO.NET pour plus d'informations.

Mis à jour le 2 novembre 2004 abelman

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();
Consulter la page cours pour ADO.NET.

Mis à jour le 2 novembre 2004 abelman

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();
Consulter les cours sur ADO.NET pour plus d'informations.

Mis à jour le 2 novembre 2004 abelman

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("'", "''");

Mis à jour le 2 novembre 2004 abelman

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";
Plus d'informations sur les différents cours ADO.NET (voir liens ci-dessous)

Mis à jour le 2 novembre 2004 Thomas Lebrun

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"); 
    } 
}
Voici, après traitement, le contenu du fichier 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>

Mis à jour le 2 novembre 2004 Thomas Lebrun

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(); 
}

Mis à jour le 22 août 2006 neguib saline

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
Dans l'évènement click d'un bouton, nous pouvons mettre :

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);

Mis à jour le 22 août 2006 saline

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;

Mis à jour le 2 janvier 2007 Jérôme Lambert

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();

Mis à jour le 20 mars 2007 Jérôme Lambert

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é.");

Mis à jour le 10 juin 2008 Kerod

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.");

Mis à jour le 10 juin 2008 Kerod

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é";

Mis à jour le 10 juin 2008 Kerod

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2017 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.

 
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -