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

Dotnet Discussion :

[DEBUTANT] Données d'une jointure sur deux datatable [Fait]


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 212
    Par défaut [DEBUTANT] Données d'une jointure sur deux datatable
    Bonjour,

    Je cherche a recuperer des donnees provenant de deux dataset. (Requete général impossible car environnment different).

    J'ai crée une relation graphiquement entre les deux datatablemais je ne sais pas comment recuperer les champs de la table parent et enfant.

    Je tente d'utiliser les fonction suivante que j'ai mis dans
    la class business de la page :

    Il y a deux DataTable : PART_ORACLE et PART_DB2
    et je souhaite afficher un gridview qui recupere des champs des deux côtés.

    il y a troisproblèmes :
    - je n'arrive pas à configurer l'object datasource. Je vois bien ma class business mais pas de methode liée à la creation du dataset
    - public DataRelationCollection ChildRelations { get; } pose problème (must declare a body)
    - il ne reconnait pas les champs en gras.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                  dataSet.Tables["PART_DB2"].Rows.Add(
                        new object[] { CTIDNO });
    
                        dataSet.Tables["PART_ORACLE"].Rows.Add(
                            new object[] {CTIDNO,ACH});
    Voici le code de ma class
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    public static void GetChildRowsFromDataRelation()
            {
                /* For each row in the table, get the child rows using the
                ChildRelations. For each item in the array, print the value
                of each column. */
                DataTable table = CreateDataSet().Tables["PART_ORACLE"];
                DataRow[] childRows;
                foreach (DataRelation PART_DB2_PART_ORACLE in table.ChildRelations)
                {
                    foreach (DataRow row in table.Rows)
                    {
                        PrintRowValues(new DataRow[] { row }, "Parent Row");
                        childRows = row.GetChildRows(PART_DB2_PART_ORACLE);
                        // Print values of rows.
                        PrintRowValues(childRows, "child rows");
                    }
                }
            }
     
            public DataRelationCollection ChildRelations { get; }
            public static DataSet CreateDataSet()
            {
                // create a DataSet with one table, two columns
                DataSet dataSet = new DataSet();
     
                // create PART_DB2 table
                DataTable table = new DataTable("PART_DB2");
                dataSet.Tables.Add(table);
                table.Columns.Add("CTIDNO",typeof(string));
                table.Columns.Add("RCDLOC",typeof(string));
                table.PrimaryKey = new DataColumn[] { table.Columns["CTIDNO"] };
     
                // create PART_ORACLE
                table = new DataTable("PART_ORACLE");
                dataSet.Tables.Add(table);
                table.Columns.Add("CTIDNO",typeof(string));
                table.Columns.Add("RCPT_ZONE",typeof(string));
                table.PrimaryKey = new DataColumn[] { table.Columns["CTIDNO"] };
     
                // create relation
                dataSet.Relations.Add(dataSet.Tables["PART_DB2"].Columns["CTIDNO"],
                    dataSet.Tables["PART_ORACLE"].Columns["CTIDNO"]);
     
                // populate the tables 
                // add PART_DB2 record
                    dataSet.Tables["PART_DB2"].Rows.Add(
                        new object[] { CTIDNO });
     
                        dataSet.Tables["PART_ORACLE"].Rows.Add(
                            new object[] {CTIDNO,AVGLEADTIME});
     
                return dataSet;
            }
     
            private static void PrintRowValues(DataRow[] rows, string label)
            {
                Console.WriteLine("\n{0}", label);
                if (rows.Length <= 0)
                {
                    Console.WriteLine("no rows found");
                    return;
                }
                foreach (DataRow row in rows)
                {
                    foreach (DataColumn column in row.Table.Columns)
                    {
                        Console.Write("\table {0}", row[column]);
                    }
                    Console.WriteLine();
                }
            }
    Pouvez-vous m'aiguiller ?

    Merci pour votre aide

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Pour ton un tu essayes d'insére un row avec des valeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dataSet.Tables["PART_DB2"].Rows.Add(
                        new object[] { CTIDNO });
     
    dataSet.Tables["PART_ORACLE"].Rows.Add(
                            new object[] {CTIDNO,ACH});
    Donc mécaniquement, ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dataSet.Tables["PART_DB2"].Rows.Add(
                        new object[] { "CTIDNO" });
     
    dataSet.Tables["PART_ORACLE"].Rows.Add(
                            new object[] {"CTIDNO","ACH"});
    puisque tu as spécifié avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    table.Columns.Add("CTIDNO",typeof(string));
    Vu qu'à priori tu as pris le code de msdn, pour voir tes méthodes vérifie que ton objet business est static, ou le cas échéant, supprime le static des méthodes.

    D'ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static DataRelationCollection ChildRelations { get; }
    Tiens essayes cette classe et ce test u (Je me suis peut être trompé dans le sens de la relation DB2--> Oracle)

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    public class DataSetMixer
        {
            private static readonly DataSetMixer instance = new DataSetMixer();
     
            private DataSet _mixed=new DataSet();
            private DataTable _oracle = new DataTable("PART_ORACLE");
            public DataTable _db2 = new DataTable("PART_DB2");
            public DataTable _mixedtable = new DataTable("SELECTION");
     
     
            static DataSetMixer() { }
     
            DataSetMixer()
            {
                CreateOracle();
                CreateDB2();
                CreateSelection();
                BuildDataset();
            }
     
            public static DataSetMixer Instance
            {
                get { return instance; }
            }
     
            private void CreateOracle()
            {
                _oracle.Columns.Add("CTIDNO", typeof(string));
                _oracle.Columns.Add("RCPT_ZONE", typeof(string));
                _oracle.PrimaryKey = new DataColumn[] { _oracle.Columns["CTIDNO"] };
            }
     
            private void CreateDB2()
            {
                _db2.Columns.Add("CTIDNO", typeof(string));
                _db2.Columns.Add("RCDLOC", typeof(string));
                _db2.PrimaryKey = new DataColumn[] { _db2.Columns["CTIDNO"] };
            }
     
            private void CreateSelection()
            {
                _mixedtable.Columns.Add("CTIDNO", typeof(string));
                _mixedtable.Columns.Add("RCDLOC", typeof(string));
                _mixedtable.Columns.Add("RCPT_ZONE", typeof(string));
                _mixedtable.PrimaryKey = new DataColumn[] { _mixedtable.Columns["CTIDNO"] };
            }
     
            private void BuildDataset()
            {
                _mixed.Tables.AddRange(new DataTable[]{_oracle, _db2,_mixedtable});
                _mixed.Relations.Add(_mixed.Tables["PART_ORACLE"].Columns["CTIDNO"], _mixed.Tables["PART_DB2"].Columns["CTIDNO"]);
            }
     
            public DataSet GetFullDataSet
            {
                get { return _mixed; }
            }
     
            public DataSet GetDataSetWithMixedBy(int _rowid)
            {
                GetChildRowsFromDataRelation(_rowid);
                return _mixed;
     
            }
     
            private DataTable GetChildRowsFromDataRelation(int index)
            {
     
                try
                {
                    _mixedtable.Rows.Clear();
                    DataRow[] childRows=_oracle.Rows[index].GetChildRows(_oracle.ChildRelations[0]);
                    foreach (DataRow dr in childRows)
                    {
                        _mixedtable.Rows.Add(new object[] { dr[0], dr[1], _oracle.Rows[index][1] });
                    }
                    return _mixedtable;
                }
                catch(Exception ex)
                {
                    return null;
                }
     
            }
     
            public void PopulateDataSet()
            {
                _mixed.Tables["PART_ORACLE"].Rows.Add(
                    new object[] { "CTIDNO", "AVGLEADTIME" });
     
                _mixed.Tables["PART_DB2"].Rows.Add(
                    new object[] { "CTIDNO" });
     
            }
     
     
        }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [TestMethod]
            public void GetSet()
            {
                var g = DataSetMixer.Instance;
                g.PopulateDataSet();
                var t=g.GetFullDataSet;
                Assert.IsTrue(t.Tables.Count == 3);
                Assert.IsTrue(t.Tables[0].Rows.Count == 1);
                Assert.IsTrue(t.Tables[1].Rows.Count == 1);
                var g2=g.GetDataSetWithMixedBy(0);
                Assert.IsTrue(g2.Tables[2].Rows.Count == 1);
                Assert.IsTrue(g2.Tables[2].Columns.Count == 3);
            }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 212
    Par défaut
    Merci pour ton aide.

    Trois choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /*public static DataRelationCollection ChildRelations { get; }*/
    -> reste toujours en erreurs.

    -> enlevé le static pourtant je ne vois toujours pas la methode

    ----> Du coup j'ai essayé ta solution :
    J'ai crée la classe : aucun problème
    J'ai crée une page pour test u mais il ne reconnait pas var et Assert alors que j'ai mis les references common,business,Data,Pages,Properties
    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
    {
        public partial class DataSetMixer : ApplicationPage
     
        {
        public void GetSet()
            {
                var g = DataSetMixer.Instance;
                g.PopulateDataSet();
                var t = g.GetFullDataSet;
                Assert.IsTrue(t.Tables.Count == 3);
                Assert.IsTrue(t.Tables[0].Rows.Count == 1);
                Assert.IsTrue(t.Tables[1].Rows.Count == 1);
                var g2 = g.GetDataSetWithMixedBy(0);
                Assert.IsTrue(g2.Tables[2].Rows.Count == 1);
                Assert.IsTrue(g2.Tables[2].Columns.Count == 3);
     
            }
        }
    }
    Sinon je vois bien cette methode pour la configuration de l'object source mais il demande un parametre.

    Merci

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    var c'est que tu n'es pas en .NET 3.5 mais en 2.0;
    et les test, il faut le jouer dans une projet de tests unitaires.


    Si c'est une page web; fais attention avec le singletion.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 212
    Par défaut
    Je suis desolé mais je ne comprends pas tout.

    Ok pour le problème de version mais je ne peux pas en changer.
    Comment puis-je contourner le problème ?

    C'est une page web ;
    dois je rajouter ceci pour le singleton ? et ou ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public bool Singleton { get; set; }
    En ce qui concerne le test unitaire, j'ai lu que je devais gérer ceci a travers l'explorer de solution (clic droit...)
    Mais comment ceci fonctionne en prod ? Quel parametre dois-je mettre ?

    Je continue de chercher.
    Merci.

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Dans le framework 3.5, à la place d'instancier par type, tu peux instancier par var :

    2.0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataTable dt=new DataTable();
    3.5 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DataTable dt=new DataTable();
    // ou
    var dt=new DataTable();

    Un singleton est un objet dit statique; le but du jeu est de ne pas avoir à recréer une instance à chaque fois.
    Le modéle que j'utilise permet de s'assurer que les threads pourront chacun utiliser un objet distinct
    Definition ici

    Dans une page web tu as une notion dite de postback; c'est à dire que schématiquement, toute action faite sur le client (l'utilisateur du site) va provoquer l'interrogation du server qui va poster la page en retour
    Donc ta page "n'est pas unique", au sens où à chaque fois qu'une action va intervenir, ta page sera reconstruite côté serveur (à la différence de 'ajax' par ex. qui travaille côté client / browser).
    Si tu utilises le binding et une logique de sélection, tu devras vérifier avant d'afficher les éléments que tu n'es pas en postback.
    Sinon ta page recevra les derniéres propriétés du singleton (qui lui est toujours en vie) ce qui n'est pas nécessairement souhaitable.

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

Discussions similaires

  1. pbls de jointure sur deux tables d'une base de donnée
    Par ciolvic dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/06/2010, 09h32
  2. Données d'une ligne sur deux lignes ?
    Par roman67 dans le forum SQL
    Réponses: 11
    Dernier message: 21/10/2008, 17h36
  3. [MySQL] Faire une jointure entre deux tables qui ne sont pas dans la même base de données
    Par sandddy dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 03/04/2008, 14h18
  4. [VS2005] Jointure sur deux DataTables
    Par belfaigore dans le forum VB.NET
    Réponses: 6
    Dernier message: 05/07/2007, 14h13
  5. [Oracle] jointures avec une somme sur deux champs
    Par guggus dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/10/2006, 17h06

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