2009-05-18 9 views
1

J'utilise le framework 2.0 et je cherche un moyen générique pour déterminer si une colonne existe dans une table. Je veux utiliser ce code avec plusieurs types de bases de données et fournisseurs.Générique pour déterminer si une colonne existe dans ADO.NET

La méthode GetSchema renvoie des informations de schéma, mais le format des informations et des données pour limiter les informations renvoyées les deux semblent être spécifiques au fournisseur.

Les autres solutions que j'ai vues semblent se réduire à Select * à partir de la table, puis rechercher les résultats pour voir si la colonne existe. Cela fonctionnera mais il semble fou d'émettre un select pour toute la table pour voir si une colonne existe.

Répondre

3

Deux options que je peux penser tout de suite:

Ce serait bien d'utiliser les vues INFORMATION_SCHEMA qui font partie de la norme SQL, mais pas tous les systèmes de base de données les mettent en œuvre. Mais si l'ensemble de bases de données qui vous intéresse l'implémente, c'est votre meilleur choix.

Une autre option est de prendre votre requête, mais ajouter un « 1 = 0 » clause si elle ne renvoie aucune ligne. ADO.NET renvoie toujours le schéma dans ce cas

EDIT: En fait, la deuxième méthode vous donnera l'existence de colonnes et leurs types de données. Cependant, je ne suis pas sûr que vous allez obtenir des informations complètes sur le schéma, comme la longueur maximale, NULLable, etc. Les vues INFORMATION_SCHEMA sont vraiment la meilleure option, mais ORACLE ne les implémente pas.

Je n'ai rencontré ceci:

http://database-geek.com/2009/04/30/oracle-information_schema/

qui est un effort open source pour railler les vues INFORMATION_SCHEMA dans Oracle. Je n'ai aucune idée à quel point cet effort est complet ou fonctionnel à ce stade.

+0

Je n'ai pas besoin de toutes les informations de schéma dans ce cas. J'essaie juste d'implémenter une méthode bool FieldExists (string tableName) générique. –

+0

J'adore essayer d'expliquer à la direction en quoi le standard SQL n'est pas vraiment un standard, car tant est implémenté différemment ou pas du tout implémenté dans des bases de données différentes. –

+0

C'est pourquoi j'ai été intrigué par ce projet d'implémenter INFORMATION_SCHEMA sur Oracle. Oracle est la grande exception ici, mais il ne devrait vraiment pas être si difficile à mettre en œuvre. Oracle fournit toutes ces informations, uniquement dans un ensemble personnalisé de tables/vues. Certaines personnes prennent le temps de construire la vue pour traduire les données dans le bon schéma. – Clyde

2

Au lieu de choisir * à partir de la table que vous pouvez faire:

select * from table 
where true=false 

Cela vous permettra de voir ADO les noms des colonnes sans retourner l'une des données. Il pourrait y avoir une meilleure façon plus générique d'interroger les tables système parmi les fournisseurs de bases de données, mais je ne le connais pas.

+0

Cette solution est ce que j'ai réellement implémenté. J'ai marqué la solution de Clyde comme la solution acceptée car il mentionne cette solution et l'INFORMATION_SCHEMA qui pourrait être meilleure pour certains. –

Questions connexes