ADO.NET supporte plusieurs bases de données, et pas seulement SQLServer. Vous pouvez faire de l’Oracle, principalement, et vous disposez aussi d’un driver OLEDB. Mais ne comptez que sur vous-mêmes si vous souhaitez développer une application supportant plusieurs bases de données. Vous pouvez utiliser les interfaces de programmation pour la connexion, quelques classes de résultats, mais dès que vous faites une commande paramétrée, vous devrez prendre en compte les différents cas possibles.
Le problème devient plus complexe lorsque vous désirez utiliser des DataSets typés. Si vous créez les mêmes structures dans deux bases de données différentes, les types C# correspondants ne sont pas les mêmes dans tous les cas, et surtout, le code généré contient le pointeur vers la base ainsi qu’une grosse partie de code spécifique à la base de données pointée.
Bref, si vous souhaitez écrire du code générique utilisant un DataSet typé dans deux bases de données, vous êtes bons pour écrire une couche intermédiaire. Et c’est là que ça devient drôle : comme les fonctions du DataSet typé renvoyent elles-mêmes des objets typés selon la base, vous êtes bons pour réécrire une redirection pour toutes les fonctionnalités que vous utilisez. En tout cas, je n’ai personnellement pas trouvé d’autre solution.
Le mieux que j’ai trouvé pour l’instant et de créer une classe chapeautant les deux DataSet typés et contenant des instances pour chacune des bases, sachant qu’une seule sera effectivement instanciée à la fois. On fait la même chose en interne, à savoir que les objets dont on a besoin sont eux-mêmes rendus génériques en créant une classe contenant une instance de chaque sous-objet typé. Ensuite, l’idée est de mettre en place des constructeurs différenciés pour chaque instance typée, et dans chaque classe correspondant à une table, de pointer sur le DataSet parent, ce qui nous permettra de retrouver le DataSet typé à utiliser à chaque moment.
Enfin, si vous avez du code qui bouclait sur la collection Rows, vous implémentez l’interface IEnumerable sur ces tables, l’implémentation de la fonction GetEnumerator contenant le code ci-dessous :
foreach (DataSet.MaTableRow Ligne in InstanceDataSetParent.InstanceDataSetTypee.MaTable.Rows) yield return new MaTableRow(Ligne);
Personnellement, c’est la première fois que je trouve une utilité hors des exemples standards pour le mot clé yield. Dans ce cas précis, je ne sais pas comment j’aurais fait pour transformer la collection sans trop perdre en performance.
Si vous êtes intéressé par le code un peu plus complet que cette rapide description, n’hésitez pas à me contacter.