IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Recuperer les informations d'une table


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut Recuperer les informations d'une table
    Salut à tous , je suis depuis un moment à la recherche d'un moyen de récupéré les informaations d'une table donné.

    Ce moyen doit etre generique c a d que je ne suis pas sensé savoir avec quelle base de donnée mon application va interagir.

    J'avais utilisé la methode GetShemaTable de la classe DataReader.

    Mais elle ne me donne pas les informations sur las champs etant des clé etrangère alors que j'en ai besoin.

    Et aussi , pour utiliser cette methode , il me fallait ecrire une requete (Select). Qui ne me sert à rien , ce qui n'est pas optimal.

    Pouvez vous m'aider ??

  2. #2
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Salut,

    tu ne connais pas la base sur laquelle tu travaille, mais connais tu le type de base (mySql, sql server, oracle, etc...) ? ou change t'il à chaque fois?

    J'ai eu à faire un code comme ça mais c'était uniquement sur du SQL server, et c'est beaaaauuucoup plus de sql que de c#...

    @plus

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Je developpe une Bibliothque de Classe qui va permettre de generer un formulaire de saisi pour une table donnée.
    La classe doit etre generique donc l'utilsateur de ma classe peut l'utiliser avec n'importe Base de donnée.

  4. #4
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Pour ce que j'en sais, en utilisant seulement c# tu ne pourras pas TOUT récupérer (notamment les clés étrangères comme tu l'as dit toi même, j'ai rien trouvé de probant à ce sujet).

    Par contre, si ton utilisateur donne les infos nécessaires (type de provider, nom du serveur, login/passwd et nom de la base), toutes les informations sont disponibles en interrogeant le SGBD (sous Sql Server 2000, j'utilise les vues/tables systèmes, qui sont très efficaces, pour les autre sgbd je ne m'y connais pas assez...)

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 159
    Points : 25 079
    Points
    25 079
    Par défaut
    tu ne réponds pas à la question
    tout type de base ou tout type de serveur de données ?

    si c'est tout type de serveur de données, il va falloir écrire du code spécifique à chaque sgbdr, mais rien n'empeche de faire un appel générique qui déterminera quel code utiliser (genre de drivers)

    si tu attaques que du sql server, il y a smo qui répond parfaitement à ton besoin


    le getschematable ne donnera jamais les foreign key
    par contre le fait d'etre obligé de faire un select * n'est pas dérangeant quand on donne en parametre schema or keyinfo, c'est un select spécial qui ne rapatrie aucune données mais récupère les infos
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    tu ne réponds pas à la question
    tout type de base ou tout type de serveur de données ?

    si c'est tout type de serveur de données, il va falloir écrire du code spécifique à chaque sgbdr, mais rien n'empeche de faire un appel générique qui déterminera quel code utiliser (genre de drivers)

    si tu attaques que du sql server, il y a smo qui répond parfaitement à ton besoin


    le getschematable ne donnera jamais les foreign key
    par contre le fait d'etre obligé de faire un select * n'est pas dérangeant quand on donne en parametre schema or keyinfo, c'est un select spécial qui ne rapatrie aucune données mais récupère les infos
    Tu peux en dire plus sur "smo"? ça pourrait m'intéresser aussi pour mon projet...

    Merci.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 159
    Points : 25 079
    Points
    25 079
    Par défaut
    smo est la dll .net représentant le modèle objet d'sql server

    y a un object serveur, sur lequel y a une collections de database
    sur une database tu vois les tables, les stored procedures ... sur les tables on voit les colonnes, les pk, les fk, les indexes ...

    pour chaque objet on peut demander le script sql avec des 10aines d'options (rajouter if not exists, avoir toutes les dépendances de scriptées ...)

    on peut meme créer des objets sans faire d'sql, par exemple un new table

    trouvable dans ajouter référence "microsoft.sqlserver.smo" surement (il en faut 4 ou 5 pour tout faire vs te diras lesquelles
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Merci les gar me voila bien renseigner.
    Sinon perot51 , je voulais dire tout type de SGBD.
    SqlServer , Oracle ...
    Alors la ça veu dire que ma tache est un peu compliqué.

    Mais es ce qu'avec un dataset , je pourrai regler ce probleme ?
    c-a-d que je copie la table dans mon dataset avec toute les contraintes .
    Et j'utilise des methodes comme GetChildreRow , pour determiner les clé etrangere.
    Toute fois , je pense que ce serai du gaspillage, de devoir créer une memoire que je n'utiliserai plus par la suite

  9. #9
    Inactif
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 59
    Points : 73
    Points
    73
    Par défaut Utiliser les interfaces combinées avec Class Factory
    Bonjour !
    J'ai deja travaillé sur un projet qui impliquait l'importation de données à partir de n'importe quel type de provider vers un base de données access. pour regler le probleme j'ai dû créer ma propre librairie avec les interfaces IDBConnection, IDataAdapter, ... et pour gérer les differents de traitements j'ai implémenté le CRUD suivant le design pattern Class Factory. J'espere que je ça va guider tes efforts.

    Bon courage

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Peut me donné une idée sur commen tu as implémenté la methode Pour retourné le DbDataAdapter approprié.
    et comment est se qu'on le manipule
    J'ai essayé de le créé avec un new mais ça ne marche pas

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 159
    Points : 25 079
    Points
    25 079
    Par défaut
    Citation Envoyé par buxus Voir le message
    design pattern Class Factory

    google
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Je pense que je n'ai pas été assez clair
    j'ai deja cherché sur google , et j'ai même implementé cela. Le probleme c'est juste pour la creation du DbDataAdapter.

    J'ai reussi à le créé mais au moment de l'instancier avec un new , l'interpreteur me signale que je ne peux pas l'instancier car c'est une classe abstraite.

    Donc après avoir créé mon dataAdapter que doi je faire ?

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 159
    Points : 25 079
    Points
    25 079
    Par défaut
    je vois pas ce qui te bloques

    le design pattern factory est simple, tu as une base soit une interface, soit une classe, soit une classe abstraite
    et selon un paramètre qu'on te donne tu retourne un objet implémentant l'interface, ou dérivé de la classe (abstraite ou non)
    l'instanciation se fait via une fonction static en général

    donc tu fait une fonction qui retourne un dbdataadapter et qui instancie soit un oledbdataadapter soit un autre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Je vois , mais ma question etai comment instancier un SqlDataAdapter par exemple à partir du DbDataAdapter. j'ai pas trouvé la reponse sur net

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 159
    Points : 25 079
    Points
    25 079
    Par défaut
    pourquoi veut tu instancier un SqlDataAdapter à partir d'un DbDataAdapter ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    J'ai créé une classe d'accès au donnée , à partir du DbProviderFactory.
    Et là je suis entrain de developper des methodes pour ma classe Generique.
    Maintenant j'aurai besoin d'un methode qui me crée un DataAdapter.
    Je l'ai fai , ça retourne un DbDataAdapter.

    Mais le soucis , au niveau de la manipulation de ma classe quand je recupère le DbDataAdapter et que je veu l'utiliser pour remplir un dataset , j'ai tous les probleme.

    VS m'interdi de l'instancier avec un new.
    Du coup je sais pas comment faire pr remplir mon dataset avec .

    Peut m'expliquer comment ça fonctionne .

  17. #17
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Salut,

    voila un aperçu du code que j'utilise, tiré d'un tuto du site que je retrouve plus

    Une classe abstraite d'accès à tes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public abstract class DataProvider
    {
     
    	protected DataProvider() { }
     
    	protected abstract IDbConnection CreateConnection(string connectionString);
     
    	protected abstract IDbDataAdapter CreateAdapter(IDbCommand command);
    }
    Une classe pour chaque type de provider, qui hérite de la précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class DataProviderSqlClient : DataProvider
    {
     
    	internal DataProviderSqlClient() : base() { }
     
     
    	protected override IDbConnection CreateConnection(string connectionString)
    	{ 
    		return new SqlConnection(connectionString);
    	}
     
    	protected override IDbDataAdapter CreateAdapter(IDbCommand command)
    	{
    		return new SqlDataAdapter((SqlCommand)command);
    	}
    }
    une classe qui permet de choisir la bonne factory en fonction du provider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public sealed class DataProviderFactory
    {
    	private DataProviderFactory() {}
     
    	public static DataProvider GetInstance(string provider)
    	{
    		DataProvider instance = null;
     
    		switch (provider.ToUpper().Trim())
    		{
    			case "SQLSERVER":
    				instance = new DataProviderSqlClient();
    				break;
    			case "ODBC":
    				instance = new DataProviderOdbc();
    				break;
    			default:
    				throw new NotImplementedException();
    		}
     
    		return instance;
    	}
    }
    Une classe quelconque utilisant la factory pour obtenir un DataSet (note : tu n'as plus besoin de créer tes objets via new)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    static class QueryManager
    (
    	public static DataSet GetDataResults(string query)
    	{
    		DataSet dts = null;
    		using (IDbConnection c = DataProviderFactory.GetInstance().GetSqlConnection())
    		{
    			try
    			{
    				c.Open();
    				IDbCommand cmd = c.CreateCommand();
    				cmd.CommandText = query;
    				cmd.CommandTimeout = 180;
     
    				IDataAdapter adpt = DataProviderFactory.GetInstance().GetAdapter(cmd);
    				DataSet dts = new DataSet();
    				adpt.Fill(dts);
    			}
    			catch 
    			{
    				 // gestion des erreurs
    			}
    		}
     
    		return dts;
    	}
    }
    J'espère que ça t'aidera,

    @plus

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recuperer les colonnes d'une table selon leur nom
    Par lolo_momo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2007, 11h56
  2. [ODBC/Interbase] Comment récupérer les données d'une table ?
    Par etiennegaloup dans le forum Accès aux données
    Réponses: 3
    Dernier message: 27/09/2006, 08h55
  3. Recuperer Les Donnees D'une Table
    Par brute dans le forum Oracle
    Réponses: 9
    Dernier message: 12/05/2006, 12h01
  4. SQLClientDataSet , recupere les champs d'une table? !
    Par aroundzefur dans le forum C++
    Réponses: 1
    Dernier message: 13/04/2006, 11h54
  5. Réponses: 5
    Dernier message: 25/07/2005, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo