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

Accès aux données Discussion :

[ADO.NET][IDbDataAdapter] Comment nommer les tables dans un dataset ?


Sujet :

Accès aux données

  1. #1
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut [ADO.NET][IDbDataAdapter] Comment nommer les tables dans un dataset ?
    Habituellement, avec Odbc par exemple, on peut nommer les tables quand on utilise la méthode fill de l'objet OdbcDataAdapter.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OdbcDataAdapter adapter = ....;
    //....
    DataSet ds=new DataSet();
    adapter.Fill(ds,"matable");
    Ce qui permet par la suite de manipuler les tables en utilisant leur nom plutôt que leur index, ce qui est très appréciable. Seulement, voilà, comment faire quand on travaille sur un composant d'accès aux données, donc avec l'interface IDbDataAdapter ?...

    En effet, IDbDataAdapter n'implémente pas la méthode void Fill(DataSet, string)...

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Certes cependant tu auras bien a passer en paramètre une instance de DataAdapter, donc par Reflection tu dois pouvoir invoquer sa méthode Fill.
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par neguib
    tu auras bien a passer en paramètre une instance de DataAdapter
    où ça ?

    Tu es bien obscur, ce soir, neguib :p ou alors c'est moi qui suis fatigué

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Ben les deux certainement, car je suis fatigué également et qu'il est temps que je mette la clé sous la porte jusqu'à demain matin. Si tu as du temps ce soir, met moi un peu de code ou un algo precis de la démarche
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Y'a pas grand chose à part une dll d'accès universel aux données pour le moment...

    Enfin, voilà un exemple :
    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
    DBConnector.Connect(DataProvider.MySql, "data source=localhost;user id=root;database=test");
    IDbCommand SelectCommand=DBConnector.CreateCommand("SELECT * FROM test");
    IDbCommand InsertCommand=DBConnector.CreateCommand("INSERT INTO test (duration) VALUES (?)",
        new DBParameter(null,DataType.VarChar,20,"duration"));
    IDbCommand UpdateCommand=DBConnector.CreateCommand("UPDATE test SET duration = ? WHERE id = ?",
        new DBParameter(null,DataType.VarChar,20,"duration"),
        new DBParameter(null,DataType.Long,20,"id"));
    IDbCommand DeleteCommand=DBConnector.CreateCommand("DELETE FROM test WHERE id = ?",
        new DBParameter(null,DataType.Long,20,"id"));
    IDbDataAdapter adapter = DBConnector.GetAdapter(
        SelectCommand,InsertCommand,UpdateCommand,DeleteCommand);
     
    DataSet ds = new DataSet();
    adapter.Fill(ds); // Pas d'implémentation de adapter.Fill(DataSet,string)
     
    // TODO modification du DataSet
    ds.Tables [0].Rows [3] ["duration"] = "coucou !"; // Pas pratique.
    // Encore de modifications...
     
    // Et un peu plus loin la mise à jour ou l'annulation des modifs...
    adapter.Update(ds);
    ds.AcceptChanges();

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Points : 78
    Points
    78
    Par défaut
    Avec un IDbDataAdapter tu ne peux nommer des tables.
    Y a une seule table et elle s'appelle Table.
    Je n'ai pas encore trouvé de solution à ca hormis implémenter une méthode Fill(DataSet, String).
    Et cette solution a l'air "chaude"

  7. #7
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bon je reprend , quel est le type de DBConnector car je ne connais pas de méthode GetAdapter() même sous 2.0
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  8. #8
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    DBConnector, c'est juste un DP Factory de mon cru, qui me permet de gérer, à priori, n'importe quel connexion ADO.NET, ce qui me permet d'éviter de reprogrammer plein de chose à chaque fois, si jamais le SGBDR change.

    Une petite question, juste au cas où : comment organises-tu, généralement, ton code quand tu as besoin d'accéder à une base de données ?

  9. #9
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par davcha
    DBConnector, c'est juste un DP Factory de mon cru, qui me permet de gérer, à priori, n'importe quel connexion ADO.NET, ce qui me permet d'éviter de reprogrammer plein de chose à chaque fois, si jamais le SGBDR change.
    ok dans ce cas il serait plus interressant que je vois ta méthode GetAdapter
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  10. #10
    Membre habitué Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 183
    Points
    183
    Par défaut
    Neguib, DBConnector est sa classe d'acces aux donnée générique qui possède les méthodes statiques qui lui instancient et renvoient la panopolie de "IDb...".
    Davcha, tu peux imaginer avoir une méthode statique FillDataset dans ta classe DBConnector qui fasse un truc du genre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private static int FillDataSet(IDbDataAdapter adapter, DataSet dataset,
     string tableName)
    {
         adapter.TableMappings.Add("Table", tableName);
         return adapter.Fill(dataset);
    }
    pas très élégant, je te l'accorde, mais ca fonctionne...

    ps: oups je suis à la bourre...effectivement DbDataAdapter c'est mieux, de toute facon je crois que DbDataAdapter est une classe abstraite qui implémente IDbDataAdapter qui lui même hérite de IDataAdapter

  11. #11
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static IDbDataAdapter GetAdapter(IDbCommand SelectCommand,
     IDbCommand InsertCommand, IDbCommand UpdateCommand, 
    IDbCommand DeleteCommand)
     {
        return dbProvider.GetAdapter(SelectCommand, InsertCommand,
     UpdateCommand, DeleteCommand);
    }
    C'est vraiment quelque chose de "tout con", dbProvider est une interface qu'implémentent chacun de mes accesseurs concrets.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MySqlDBProvider : DBProvider{...}
    Ensuite, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public IDbDataAdapter GetAdapter(IDbCommand SelectCommand,
     IDbCommand InsertCommand, IDbCommand UpdateCommand,
     IDbCommand DeleteCommand)
     {
        MySqlDataAdapter adapter = new MySqlDataAdapter
    (( MySqlCommand )SelectCommand);
        adapter.InsertCommand = ( MySqlCommand )InsertCommand;
        adapter.UpdateCommand = ( MySqlCommand )UpdateCommand;
        adapter.DeleteCommand = ( MySqlCommand )DeleteCommand;
        return adapter;
    }

    Pas très compliqué, encore une fois.

    En revanche, j'arrête pas de me poser des questions à propos du concept des DataSet/DataTables, etc...
    Ca fout pas un peu la merde dès qu'il y a des accès en concurrence ?
    (Je précise que j'ai beaucoup plus l'habitude des DataReaders et autres ExecuteXXX, alors que le DataAdapter j'y ai jamais vraiment touché jusqu'ici).

  12. #12
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    C'est bon, j'ai utilisé DbDataAdapter comme l'a suggéré del-dongo et ça passe sans problème

    Mais je suis quand même sceptique quant à la question de la philosophie des DataSet et des conséquences vis à vis des accès concurrents.

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

Discussions similaires

  1. Comment transformer les tables dans un fichier txt vers une BD comme Mysql
    Par badrdine.in dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 20/03/2009, 12h58
  2. comment regroupe les tables dans une table
    Par helene0618 dans le forum kettle/PDI
    Réponses: 3
    Dernier message: 11/03/2009, 22h18
  3. Réponses: 1
    Dernier message: 19/02/2009, 15h37
  4. Réponses: 5
    Dernier message: 28/11/2005, 09h52
  5. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18

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