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