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 :

jointure entre deux datatables


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut jointure entre deux datatables
    Bonjour,

    Je ne sais pas tres bien dans quelle theme je peux poster ce sujet, alors j'essaye ici

    Je m'interroge sur la meilleure maniere de realiser un join entre une table dataset et une datatable

    Je m'explique :
    1- J'ai dans un dataset une datatable issue d'un query sql, cette datatable contient une colonne ID
    2- Je lis un fichier texte que je charge dans une autre datatable construite pour l'occasion (cette datatable est actuellement indépendante du dataset) cette datatable contient une colonne ID et une colonne valeur

    3- je voudrais associer les valeurs lue dans mon fichier texte a une colonne de ma table lue par sql

    - Bien sur, je peux faire deux boucles : force brute

    Mais existe-t-il une methode plus intégrée ?

  2. #2
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    391
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Décembre 2005
    Messages : 391
    Points : 301
    Points
    301
    Par défaut
    moi j'ai fait comme ca
    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
     
     
    #Region "GetJoin"
     
            ''' <summary>
            ''' retourne une table avec la jointure faite entre les 2 tables passés en parametre
            ''' </summary>
            ''' <param name="Table1"></param>
            ''' <param name="Table2"></param>
            ''' <param name="fields">les champs seront separés par un ; </param>
            ''' <param name="errorMessage"></param>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function GetJoin(ByRef Table1 As DataTable, ByRef Table2 As DataTable, ByVal fields As String, ByRef errorMessage As String, Optional ByVal where As String = "", Optional ByVal orderby As String = "") As DataTable
                Try
                    Dim Field_1 As String = fields.Split(";")(0)
                    Dim Field_2 As String = fields.Split(";")(1)
     
                    Dim returnDT As DataTable = New DataTable()
                    'on recopie les colonnes dans la table de sortie
                    For Each col As DataColumn In Table1.Columns
                        If Not returnDT.Columns.Contains(col.ColumnName) Then returnDT.Columns.Add(col.ColumnName, col.DataType)
                    Next
                    For Each col As DataColumn In Table2.Columns
                        If Not returnDT.Columns.Contains(col.ColumnName) Then returnDT.Columns.Add(col.ColumnName, col.DataType)
                    Next
     
                    Dim jointure As String = String.Empty
                    If Table1.Columns(Field_1).DataType Is System.Type.GetType("System.String") Then
                        jointure = Field_2 & " = '{0}'"
                    Else
                        jointure = Field_2 & " = {0}"
                    End If
     
     
                    Dim newRow As DataRow = Nothing
                    'pour toutes les lignes de la table 1
                    For Each row As DataRow In Table1.Rows
                        'je fais la joiture sur la table 2 et j en recupere les lignes
                        Dim rows() As DataRow = Table2.Select(String.Format(jointure, row(Field_1)))
                        For Each row2 As DataRow In rows
                            newRow = returnDT.NewRow()
                            'je recopie les donné de la table1
                            For Each col As DataColumn In Table1.Columns
                                newRow(col.ColumnName) = row(col.ColumnName)
                            Next
                            'je recopie les donné de la table2
                            For Each col As DataColumn In Table2.Columns
                                newRow(col.ColumnName) = row2(col.ColumnName)
                            Next
                            returnDT.Rows.Add(newRow)
                        Next
                    Next
     
                    's il y a une clause where
                    If where.Length > 0 Then
                        Dim dv As DataView = New DataView(returnDT)
                        dv.RowFilter = where.Replace("WHERE ", "")
                        returnDT = Me.GetTableFromDataView(dv)
                    End If
     
                    's il y a un tri
                    If orderby.Length > 0 Then
                        Dim dv As DataView = New DataView(returnDT)
                        dv.Sort = orderby.Replace("ORDER BY ", "")
                        returnDT = Me.GetTableFromDataView(dv)
                    End If
     
                    Return returnDT
                Catch ex As Exception
                    Console.WriteLine(ex.ToString())
                    errorMessage = ex.Message
                    Return Nothing
                End Try
            End Function
     
    #End Region

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci,

    C'est effectivement une solution (a traduire en csharp)

    Corollairement :

    Je peux faire un select trié et produire un array de datarow

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataRow [] montri = DataTable.select("", "ID ASC");
    A part de nouveau une boucle, est il possible de profiter de ce tri pour faire un search rapide ?

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut question mal posée
    En fait, je pense que j'ai mal posé ma question

    Car fondamentalement, le besoin est le suivant :

    Je dispose d'une datatable triée sur un Id
    Ou accessoirement un Array de datarow (obtenu par un select) trié sur cet ID

    Quelle methode peut etre utilisée pour beneficier de ce tri pour une recheche dans la datatable ou l'array de datarow

    J'entrevois le binary search sur l'array de datarow en definissant un comparer sur la structure du row

    Il y a -t-il qq chose de plus simple ?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    391
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Décembre 2005
    Messages : 391
    Points : 301
    Points
    301
    Par défaut
    tu n as pas essayé les dataview;?

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Si, Merci

    J'utilise maintenant un dataview

    Le seul truc qui me chiffone un peu c'est que ma datatable est déja triée sur la clef voulue
    Et que quand je veux exploiter le find du dataview je dois lui redemander de trier, mais c'est academique

Discussions similaires

  1. jointure entre deux datatables
    Par olibara dans le forum C#
    Réponses: 6
    Dernier message: 27/06/2008, 17h35
  2. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  3. [C#] Requete entre deux DataTables
    Par pc152 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 02/09/2004, 11h24
  4. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  5. jointure entre deux requete
    Par Youssef dans le forum Langage SQL
    Réponses: 21
    Dernier message: 15/01/2004, 15h13

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