FAQ ASP.NET/C#

FAQ ASP.NET/C#Consultez toutes les FAQ
Nombre d'auteurs : 39, nombre de questions : 371, dernière mise à jour : 15 juin 2021
Sommaire→Travailler avec des données→ADO.NET→ADO.NET Divers- Comment fusionner 2 DataTables ?
- Comment récupérer une Row d'un DataSet via un index de DataView ?
- Comment écrire le contenu de ma table dans un fichier XML ?
- Comment créer une base de données Access ?
- Faut-il utiliser les DataReader ou les DataSet ?
- Comment éviter les erreurs dans l'écriture d'une chaîne de connexion ?
- Comment vérifier qu'un provider est installé sur la machine ?
- Comment énumérer les providers installés sur la machine ?
- Comment éviter des accès inutiles à la base de données ?
- Comment vérifier qu'un DataSet est rempli ou non?
- Comment vérifier qu'une DataTable est remplie ou non?
Pour fusionner 2 DataTables, il faut les inclure dans un DataSet :
DataTable dt1 = new DataTable("Test");
DataTable dt2 = new DataTable("Test");
DataSet ds = new DataSet();
ds.Merge(dt1);
ds.Merge(dt2);ds.Table(0) représentera la table fusionnée. Pour fusionner 2 DataTables il faut qu'elles aient le même nom, sinon une nouvelle table est ajoutée au DataSet.
Cette utilisation de la fonction merge du DataSet est décrite ici de manière simpliste pour l'utilisation la plus courante qui en est faite. Pour plus de détail sur cette fonction reportez-vous au cours d'ADO.NET.
Lien : Cours d'ADO.NET
Parfois, il est nécessaire de récupérer l'index d'un Row dans un DataTable en ne
connaissant que l'index d'un Row du DataView (qui est différent suite à un tri par exemple).
Voici comment faire:
dataview.Item[x].Row;Cette ligne retourne le Row du DataSet correspondant à l'index x du DataView.
En utilisant un DataSet et sa méthode WriteXml, vous avez la possibilité d'écrire le contenu d'une table dans un fichier XML.
public class EcrireXML
{
public static void Main()
{
// Création de la chaîne 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 :
<?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>Pour créer une base de données Access, il est possible d'utiliser le code suivant:
ADOX.CatalogClass Cat = new ADOX.CatalogClass();
Cat.Create(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName);Tout dépend le nombre de fois que vous devez utiliser les données provenant de votre base et ce que vous souhaitez en faire.
Si il s'agit d'une simple lecture des données, utilisez un DataReader car c'est ce que le DataSet utilise en interne pour se remplir.
Si vous devez accéder plusieurs fois à ces données et les modifier, utilisez un DataSet.
Il est conseillé d'utiliser l'objet SqlConnectionStringBuilder inclu dans le framework .NET 2.0.
SqlConnectionStringBuilder conStrbuilder = new SqlConnectionStringBuilder();
conStrbuilder.DataSource = serverName;
conStrbuilder.UserID = uid;
conStrbuilder.Password = pwd;
SqlConnection c = new SqlConnection (conStrbuilder.ConnectionString);Il est possible de lister les providers installés sur une machine. En filtre sur cette liste, il est possible de voir si un provider est installé ou non.
if (DbProviderFactories.GetFactoryClasses.Select("InvariantName='" + invariantName & "'").Length = 0)
Response.Write(invariantName + "n'existe pas");Le framework .NET 2.0 nous amène un objet très intéressant pour ce point. Ainsi, il existe une méthode statique GetFactoryClasses dans l'objet DbProviderFactories.
Comme on peut le voir dans le code qui suit, cette méthode renvoie une DataTable qu'il est possible de parcourir et encore d'utiliser cette DataTable pour afficher dans un composant de liste ou de grille.
DataTable providerTable = DbProviderFactories.GetFactoryClasses();
foreach (DataRow row in providerTable.Rows)
foreach (DataColumn col in providerTable.Columns)
Response.WriteLine(col.ColumnName + ": " + row(col.ColumnName));N'oubliez pas d'inclure cette ligne en début de fichier:
using System.Data.Common;Nous avons souvent des pages dont le contenu ne varient que de temps à autre. ASP.NET 2.0 amène la mise en cache d'une page et ce, de manière relativement simple. Effectivement, il suffit d'ajouter une directive au niveau de la page.
<%@ OutputCache Duration=600 VaryByParam=state SqlDependency="database:table" %>Que trouve-t-on dans cette directive? Qu'il s'agit de garder en cache l'information durant 10 minutes, et que les valeurs en cache doivent être rechargées si les données ont été modifiées durant les 10 minutes de mise en cache.
Il suffit de regarder si une ou plusieurs tables sont présentes dans ce DataSet.
public bool IsFilled(DataSet ds)
{
return ds.Tables.Count > 0;
}Il suffit de regarder si une ou plusieurs rows sont présentes dans cette DataTable.
public bool IsFilled(DataTable dt)
{
return dt.Rows.Count > 0;
}


