Il est possible d'utiliser une source de données pour effectuer un SELECT et récupérer par programmation le résultat de cette requête. Ceci nous permettra de manipuler les données à notre guise, un peu comme si on avait fait la requête « à bras », tout en profitant des facilités des sources de données.
Utilisation d'un DataView
Un DataView est un objet permettant de stocker un ensemble de données en mémoire. Attention : le mot DataView réfère à une vue au sens SQL. Il ne s'agit pas d'un contrôle visuel.
Un DataView est tout à fait approprié pour stocker le résultat d'une requête.
En mémoire, le contenu du DataView sera un tableau à deux dimensions. On aura une ligne par enregistrement retourné. Pour chaque enregistrement, on aura une colonne pour chaque champ demandé dans la requête.
1 | Apple iPad 4e génération 16 Go Wi-Fi |
2 | Ordinateur Toshiba Satellite L850 |
4 | Clé USB Kingston 32 Go |
8 | Router D-Link sans fil 802.11b/g/n |
Requête qui ne retourne qu'un seul enregistrement
Si la requête permet de retrouver 0 ou 1 enregistrement, la structure du code pour récupérer le résultat de la requête dans un DataView ressemblera à ceci :
Ex :
DataView dataViewProduit = (DataView)dataSourceProduit.Select(DataSourceSelectArguments.Empty);
if (dataViewProduit.Count > 0)
{
DataRowView donnees = dataViewProduit[0]; // retrouve la première ligne de données (ce sera la seule)
id = ...
description = ...
}
else
{
labelMessage.Text = "...";
}
Requête permettant de retourner plusieurs enregistrements (boucler dans les résultats de la requête)
Lorsque votre requête peut retourner plusieurs enregistrements, vous aurez probablement besoin de boucler dans les résultats de la requête et de faire un traitement particulier pour certains enregistrements. Le code suivant vous permettra d'y arriver.
Ex :
DataView dataViewProduit = (DataView)dataSourceProduit.Select(DataSourceSelectArguments.Empty);
if (dataViewProduit.Count > 0)
{
foreach (DataRowView donnees in dataViewProduit)
{
if (...)
{
...
}
else if (...)
{
...
}
else if (...)
{
...
// dans cet exemple, on utilise break pour sortir de la boucle foreach lorsqu'on a trouvé une valeur donnée
// à vous d'adapter ce code pour répondre à vos besoins
break;
}
}
}
else
{
labelMessage.Text = "...";
}
Extraire les données du DataView
Pour manipuler les données, on doit extraire une ligne du tableau en la stockant dans un objet de type DataRowView. Cette extraction devra être réalisée même si la requête n'a retourné qu'un seul enregistrement.
Ex : si la requêne ne retourne qu'un seul enregistrement :
DataRowView donnees = dataViewProduit[0]; // retrouve la première ligne de données
ou, si la requête peut retourner plusieurs enregistrements :
foreach (DataRowView donnees in dataViewProduit)
{
...
}
Dans cet exemple, la variable donnees aura la forme suivante :
1 | Apple iPad 4e génération 16 Go Wi-Fi |
Le DataRowView est un vecteur. Chaque champ peut donc être lu à l'aide d'un indice. Plutôt que de travailler avec des indices numériques, on travaillera avec le nom du champ.
Attention : un élément tiré d'un DataRowView est un objet. Il faut donc le transtyper pour pouvoir l'utiliser correctement.
Ex :
int id = Convert.ToInt32(donnees["produit_id"]); // contiendra la valeur 1
String description = donnees["produit_description"].ToString(); // contiendra la valeur « Apple iPad 4e génération 16 Go Wi-Fi »
Traiter les données nulles
Lorsque vous traitez manuellement les données d'une source de données, il faut savoir qu'une donnée nulle est différente d'une donnée vide.
Pour éviter d'avoir à gérer différemment ces deux valeurs, assurez-vous lors du design de vos tables que les champs acceptant les valeurs nulles aient réellement besoin de pouvoir contenir des valeurs nulles.
(string) vs ToString()
Lorsque vous récupérez les données d'un champ, il faut les convertir au type désiré. Si la donnée est une chaîne de caractères, il est préférable d'utiliser ToString() plutôt que d'utiliser la conversion de type (string). En effet, si la donnée était nulle, ToString() la convertirait en chaîne vide alors que le transtypage provoquerait une erreur.
// plante à l'exécution si le champ page_titre est à nul pour l'enregistrement traité
// message obtenu : Impossible d'effectuer un cast d'un objet de type 'System.DBNull' en type 'System.String'.
// ne plante pas même si le champ page_titre est à nul pour l'enregistrement traité
// si nul, htmlTitre.Text sera mis à blanc
htmlTitle.Text = donnees["page_titre"].ToString();
Vérifier si les données sont nulles
Si vous avez à effectuer un traitement particulier pour les données nulles, il est possible de les cibler à l'aide de la syntaxe suivante :
Ex :
if (donnees["page_titre"] == DBNull.Value)
{
...
}
Pour plus d'information
« Les bases fondamentales du langage Transact SQL ». Dotnet France.http://www.dotnet-france.com/Documents/SQLServer/Les%20bases%20fondamentales%20du%20langage%20Transact%20SQL.pdf