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 :

Effectuer une requete sur un dataset


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 14
    Points
    14
    Par défaut Effectuer une requete sur un dataset
    Bonjour,

    Je suis confronté à un problème qui me semble pourtant évndent: Je voudrais faire une requete sur un dataset.
    En clair
    - j'ai un dataset qui sert de base de donnée mémoire
    - je veux faire une requete du genre "Select * from MaTable where Moinchamp=2" et récuperer le résultat dans une datatable

    Comment faire ? Est-ce au moins possible ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Aurélien19 Voir le message
    - j'ai un dataset qui sert de base de donnée mémoire
    houla, tu t'emballes un peu là
    un DataSet n'a pas grand chose à voir avec une BDD, c'est juste une copie en mémoire des données... tu n'as pas le dixième des fonctionnalités proposées par un vrai SGBD

    Citation Envoyé par Aurélien19 Voir le message
    - je veux faire une requete du genre "Select * from MaTable where Moinchamp=2" et récuperer le résultat dans une datatable

    Comment faire ? Est-ce au moins possible ?
    Pour une requête simple comme ça, c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataRow[] results = MaTable.Select("MonChamp = 2");
    Mais ça te renvoie un tableau de lignes, et non une DataTable (tu peux obtenir une DataTable en passant par une DataView, mais ça devient un peu lourd...)
    De plus, ça ne marche que sur une requête simple sur une seule table : impossible de faire une jointure. Tu peux jouer un peu sur les relations entre les DataTable, mais c'est assez limité.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Merci pour la réponse!

    Citation Envoyé par tomlev Voir le message
    houla, tu t'emballes un peu là
    un DataSet n'a pas grand chose à voir avec une BDD, c'est juste une copie en mémoire des données... tu n'as pas le dixième des fonctionnalités proposées par un vrai SGBD
    Oui, effectivement! Et je ne compte pas remplacer un vrai SGBD!
    En fait, je cherche juste à extraire partiellement des données depuis une datatable d'un dataset vers une autre table.
    En fait, j'utilise le dataset comme buffer, pour éviter l'accès direct à ma table dans la vrai base de données (pour améliorer les performances dans un cas bien précis)


    Pour une requête simple comme ça, c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataRow[] results = MaTable.Select("MonChamp = 2");
    Mais ça te renvoie un tableau de lignes, et non une DataTable (tu peux obtenir une DataTable en passant par une DataView, mais ça devient un peu lourd...)
    De plus, ça ne marche que sur une requête simple sur une seule table : impossible de faire une jointure. Tu peux jouer un peu sur les relations entre les DataTable, mais c'est assez limité.
    Effectivement, je suis arrivé à récuperer la collection de DataRow, mais impossible de la mettre dans une nouvelle datatable : j'ai une erreur lors de l'exécution, me disant que les lignes appartiennent déjà à une datatable!
    Pour la dataview, j'y ai pensé, mais peut on copier le résultat du dataview dan une datatable ? Et si oui, comment ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Aurélien19 Voir le message
    Pour la dataview, j'y ai pensé, mais peut on copier le résultat du dataview dan une datatable ? Et si oui, comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataView view = new DataView(MaTable, "MonChamp = 2", null, DataViewRowState.CurrentRows);
    DataTable results = view.ToTable();

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataView view = new DataView(MaTable, "MonChamp = 2", null, DataViewRowState.CurrentRows);
    DataTable results = view.ToTable();
    Merci, ca correspond exactement à ce que je cherche! Je ne connaissait pas la méthode...
    J'essaye ça demain matin!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Merci, ca marche !

    Par contre, il me reste un problème : j'utilise un dataset typé, et je n'arrive pas à ressortir mes données dans une table du même type que celle d'origine.
    En clair, j'essaye le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DS_PERSO.TABLE_PERSO TableSource;
    (...)
    DataView view = new DataView(TableSource, "MonChamp = 2", null, DataViewRowState.CurrentRows);
    DS_PERSO.TABLE_PERSO TableDest = ((DS_PERSO.TABLE_PERSO)view.ToTable());
    je me retrouve avec l'erreur suivante :
    "Impossible d'effectuer un cast d'un objet de type 'System.Data.DataTable' en type 'TABLE_PERSO'."

    Est ce que je fais bien le cast au bon endroit ? Ou est ce que je dois faire ma vue autrement (vue typée?) ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu fais le cast au bon endroit, ou plutôt, ce serait le bon endroit pour le faire si le cast était valide... mais DataView.ToTable renvoie une DataTable générique, pas une TABLE_PERSO, et il n'existe pas de conversion de DataTable vers TABLE_PERSO. Donc avec cette méthode tu ne peux pas récupérer une DataTable typée...

    Tu peux aussi faire autrement, sans passer par une vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DataRow[] results = MaTable.Select("MonChamp = 2");
    DS_PERSO.TABLE_PERSO TableDest = new DS_PERSO.TABLE_PERSO();
    foreach(DataRow row in results)
    {
        TableDest.ImportRow(row);
    }
    Mais c'est plus galère à écrire... tu peux toujours créer une méthode générique pour te simplifier la tâche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public T SelectTable<T>(T sourceTable, string filter) where T : DataTable, new()
    {
        DataRow[] results = MaTable.Select("MonChamp = 2");
        T destTable = new T();
        foreach(DataRow row in results)
        {
            destTable.ImportRow(row);
        }
        return destTable;
    }
    Et tu l'utilises comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DS_PERSO.TABLE_PERSO TableDest = SelectTable<DS_PERSO.TABLE_PERSO>(TableSource, "MonChamp = 2");

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Tu fais le cast au bon endroit, ou plutôt, ce serait le bon endroit pour le faire si le cast était valide... mais DataView.ToTable renvoie une DataTable générique, pas une TABLE_PERSO, et il n'existe pas de conversion de DataTable vers TABLE_PERSO. Donc avec cette méthode tu ne peux pas récupérer une DataTable typée...

    Tu peux aussi faire autrement, sans passer par une vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DataRow[] results = MaTable.Select("MonChamp = 2");
    DS_PERSO.TABLE_PERSO TableDest = new DS_PERSO.TABLE_PERSO();
    foreach(DataRow row in results)
    {
        TableDest.ImportRow(row);
    }
    En fait, la solution me convient très bien (il n'y a qu'une requete que je fais sur un dataset, les autres sont faites de façon plus classique : directement sur la base)!
    D'ailleurs, c'est une des premières pistes que j'ai essayé.. sauf que je n'avais pas vu le ImportRow, et je n'avais pas réussi à la faire marcher!
    Encore merci!!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/11/2012, 02h45
  2. Exécution d'une requete sur un DataSet
    Par Nico_stras dans le forum C#
    Réponses: 2
    Dernier message: 01/09/2007, 09h43
  3. une requete effectuant une recherche sur tous les champs
    Par raynor911 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/02/2006, 15h06
  4. effectuer une requete insert avec 'values' ET 'select'
    Par delaio dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/08/2004, 19h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

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