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 :

[VB.NET 2.0] Msg erreur - Problème avec DataReader


Sujet :

Accès aux données

  1. #1
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut [VB.NET 2.0] Msg erreur - Problème avec DataReader
    Bonjour,

    Au risque de passer pour une débutante... Je ne suis pas trop sûre d'avoir compris comment utiliser les DataReader avec des BD Access.

    Le code suivant:

    Code VB.NET : 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 Sub connecterBD()
            Dim StrConn As New OleDbConnection
            Dim CmdSql As New OleDbCommand
            Dim DataRdr As OleDbDataReader
            Dim StrSql As String
            Dim Value1 As New Object
            Value1 = Nothing
            Try
                StrConn = New OleDbConnection("Provider=Microsoft.Jet.OleDB.4.0; Data Source=Signs.mdb; User Id=; Password=;Mode=Share Deny None;")
     
                If (StrConn.State = ConnectionState.Closed) Then
                    StrConn.Open()
                End If
     
                StrSql = "SELECT * FROM to_print"
     
                CmdSql = New OleDbCommand(StrSql, StrConn)
     
                DataRdr = CmdSql.ExecuteReader()
     
                If (DataRdr.HasRows = False) Then
     
     
                    Exit Try
                End If
     
     
                ' Code générant des erreurs ici
                While DataRdr.Read()
                    If (DataRdr.IsDBNull(0) = False) Then
                        If (Value1.GetType Is GetType(System.Int32)) Then
                            Value1 = DataRdr.GetInt32(0) 
                         ' erreur semble générée par cette ligne
                        ElseIf (Value1.GetType Is GetType(System.String)) Then
                            Value1 = DataRdr.GetString(0)
                        ElseIf (Value1.GetType Is GetType(System.Windows.Forms.TextBox)) Then
                            Value1 = DataRdr.GetString(0)
                        ElseIf (Value1.GetType Is GetType(System.Double)) Then
                            Value1 = DataRdr.GetDouble(0)
                        End If
                    Else
                        If (Value1.GetType Is GetType(System.Int32)) Then
                            Value1 = 0
                        ElseIf (Value1.GetType Is GetType(System.String)) Then
                            Value1 = ""
                        ElseIf (Value1.GetType Is GetType(System.Windows.Forms.TextBox)) Then
                            Value1 = ""
                        ElseIf (Value1.GetType Is GetType(System.Double)) Then
                            Value1 = 0
                        ElseIf (Value1.GetType Is GetType(System.DateTime)) Then
                            Value1 = New DateTime(2000, 12, 12, 12, 12, 12)
                        End If
                    End If
                End While
     
                ' Always dispose data readers and commands as soon as practicable
                '
                DataRdr.Close()
     
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.OkOnly, "To_Print")
     
            Finally
                ' Close the connection when no longer needed
                '
                CmdSql.Connection.Close()
                'CmdSql.Dispose()
            End Try
     
     
        End Sub

    ...génère le code suivant:

    La référence d'objet n'est pas définie à une instance d'un objet
    J'ai défini la variable Value1 en tant qu'objet, car elle peut être de plusieurs types différents. Je me demande si je ne suis pas en train de jouer avec le feu en procédant de cette façon. En fait, c'est pour permettre de lire les données sur une rangée à déterminer pour l'impression d'une fiche descriptive à partir d'un élément choisi dans la BD.

    Quelqu'un de mieux qualifié que moi en ADO.NET peut-il me dire où je dois recevoir le coup de boule... euh... ce qui cloche dans ma variable Value1? Merci à l'avance...
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

  2. #2
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bonjour

    Tout dépend du type de la première colonne dans ta base de donnée.

    Pourquoi faire tout ça alors qu'il te suffit de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    If Not DataRdr.GetValue(0).Equals(DBNull.Value) Then
        ' Lecture de la colonne du DataReader
        Value1= DataRdr.GetValue(0)
    Else
        ' ....
    End If
    Par contre, je n'ai pas bien compris ou tu voulais en venir avec ton DataReader. Dans tous les cas, au final, Value1 récupérera la première colonne de la dernière ligne de ta table.
    (Peut être n'as-tu pas mis tous les élements de ton code).

    Si tu veux ne récupérer qu'une seule valeur, il faudrait plutôt passer par un ExecuteScalar.

    Sinon, pourquoi déclarer Value1, en tant qu'object ? tu dois surement connaitre le type de la colonne 1 de ta table...


    Je recommence mon message

  3. #3
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par Kelpan
    Par contre, je n'ai pas bien compris ou tu voulais en venir avec ton DataReader. Dans tous les cas, au final, Value1 récupérera la première colonne de la dernière ligne de ta table.
    (Peut être n'as-tu pas mis tous les élements de ton code).
    Éventuellement, je voudrai lire chaque champ d'un seul enregistrement et les récupérer dans le même nombre de variables, afin d'imprimer une fiche descriptive. Nous sommes deux sur ce problème, et le DataReader était notre première idée.

    Citation Envoyé par Kelpan
    Si tu veux ne récupérer qu'une seule valeur, il faudrait plutôt passer par un ExecuteScalar.
    Pour récupérer seulement la valeur de la colonne 1? Ou ça peut récupérer les valeurs des champs d'un enregistrement de la table? pardon, je suis encore un peu mélangée avec toutes ces notions en ADO.NET...



    Citation Envoyé par Kelpan
    Sinon, pourquoi déclarer Value1, en tant qu'object ? tu dois surement connaitre le type de la colonne 1 de ta table...
    La première valeur est un Integer, la seconde un String, et ça continue sur une ligne de plusieurs dizaines de colonnes.
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

  4. #4
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Le mieux est de passer par une classe de mappage qui est une déclaration des colonnes que tu as dans ta table.

    Code vb.net : 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
     
    Public Class to_printMappage
        Public mInt_Id As Integer ' Identifiant type sql = int
        Public mStr_Col1 As String = "" ' Colonne 1 type sql = varchar(n)
        Public mDte_Col2 As DateTime = #12:00:00 AM# ' Colonne 2 type sql datetime
        ' ...
     
        Public Function LireDataReader(ByVal objDataReader As OleDb.OleDbDataReader) As to_printMappage
            ' Lecture des colonnes du DataReader
            ' Identifiant
            LireColonne(objDataReader, 0, Me.mInt_Id, 0)
            ' Colonne 1
            LireColonne(objDataReader, 1, Me.mStr_Col1, "")
            ' Colonne 2
            LireColonne(objDataReader, 2, Me.mDte_Col2, New DateTime(2000, 12, 12, 12, 12, 12))
            '...
     
            ' Retourne la classe alimentée
            Return Me
        End Function
     
        Private Sub LireColonne( _
                    ByVal objDataReader As OleDb.OleDbDataReader, _
                    ByVal Int_NumCol As Integer, _
                    ByRef objValue As Object, _
                    ByVal ObjDefautValue As Object _
                    )
     
            If Not objDataReader.GetValue(Int_NumCol).Equals(DBNull.Value) Then
                ' Lecture de la colonne du DataReader
                objValue = objDataReader.GetValue(Int_NumCol)
            Else
                objValue = ObjDefautValue
            End If
        End Sub
    End Class

    Ensuite tu récupère une liste de classe de mappage dans une arraylist que tu peux traiter unhe à une dans ton traitement

    Code vb.net : 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
     
    Public Function LireTo_Print() As ArrayList
        Dim StrConn As New OleDbConnection
        Dim CmdSql As New OleDbCommand
        Dim DataRdr As OleDbDataReader
        Dim StrSql As String
        Dim arrLigneTo_Print As ArrayList
     
        Try
            StrConn = New OleDbConnection("Provider=Microsoft.Jet.OleDB.4.0; Data Source=Signs.mdb; User Id=; Password=;Mode=Share Deny None;")
     
            If (StrConn.State = ConnectionState.Closed) Then
                StrConn.Open()
            End If
     
            StrSql = "SELECT * FROM to_print"
            CmdSql = New OleDbCommand(StrSql, StrConn)
            DataRdr = CmdSql.ExecuteReader()
     
            If (DataRdr.HasRows = False) Then Exit Try
     
            ' il y a des lignes à traiter
            arrLigneTo_Print = New ArrayList
     
            While DataRdr.Read()
                arrLigneTo_Print.Add(New to_printMappage().LireDataReader(DataRdr))
            End While
     
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "To_Print")
        Finally
            ' Close the connection when no longer needed
            '
            DataRdr.Close() ' Je te conseille de fermer ton datareader dans le finally
            CmdSql.Connection.Close()
            'CmdSql.Dispose()
        End Try
    End Function

    J'espère que j'ai bien compris le problème et que ça va t'aider.

  5. #5
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Merci pour le code, cependant j'ai encore des interrogations...

    En fait, je cherche le moyen de lire directement l'enregistrement dont le «numéro» correspond à celui de la page où nous sommes rendus, afin de l'imprimer (parce que je suis dans une classe dérivée de PrintDocument), par exemple:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Me.currentPage = 2 
    ' Le DataReader ou tout autre truc doit donc lire la rangée 1 (ou 2 si on 
    ' ne part pas de zéro ici?), donc Me.currentPage -1?
    variableNom = obtenir la valeur du champ no 3

    J'ai cru voir un truc Rows(i) dans les TableAdapters... C'est la raison pour laquelle, au départ, je cherchais le moyen de faire un tableadapter.Fill() à même ma classe dérivée de PrintDocument, avant que mon collègue me parle plutôt de DataReader, et là mon cerveau a déraillé...

    [EDIT #1]
    Qu'est-ce qui serait le mieux, d'après vous, dans le cas d'une classe PrintDocument, le DataReader ou le DataSet/TableAdapter? (et cela afin d'avoir un code ressemblant à celui-ci:

    nom = nom dans l'enregistrement(Me.curentPage - 1)
    categorie = categorie dans l'enregistrement(Me.currentPage -1)
    etc.
    fin de la parenthèse)
    [/EDIT #1]

    [EDIT #2]
    Puisqu'il est question de numéros de rangées, après une recherche je crois que d'essayer avec un DataSet m'aiderait davantage... je vais y voir.
    [/EDIT]
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

  6. #6
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    J'ai un peu de mal à suivre et à comprendre.

    - Tu as un écran avec plusieurs pages sur lesquels tu peux naviguer ?
    - Chaque page correspond à un enregistrement de la table to_Print ?
    - Le numéro dans la page dont tu parles est-ce l'identifiant de ton enregistrement ?
    - Peux-tu imprimer plusieurs pages à la fois ?

    En ce qui concerne le choix du Dataset ou du DataReader, c'est à toi de voir.
    Le Dataset est en regle général plus adapté pour faire des modifs(insertion, modification, suppression) sur les enregistrements, le plus souvent lié à une DataGrid.

    Ici, tu n'as besoin que de récupérer des données.
    Pour ma part le DataReader me semble plus adapté (C'est mon avis personnel)

    Pour en revenir au code que je t'ai fourni :
    En fait, la fonction "LireTo_Print" te fournit une liste (Arraylist) de tout tes enregistrements de ta table to_Print.

    Chaque enregistrement est stockée dans une classe de mappage "to_printMappage" dont les déclarations correspondent aux colonnes de l'enregistrement.

    Si on part du principe que les enregistrements sont triés comme l'ordre de tes pages, en recupérant l'item à l'index correspondant à la page (- 1), tu auras l'enregistrement que tu désires

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaClasseTo_Print = arrLigneTo_Print(Me.currentPage -1)
    Par contre, tout dépend des réponses à mes questions plus haut, mais il serait mieux de lire l'enregistrement de la page sur laquelle tu es positionné et envoyé la classe de mappage à ton PrintDocument qui traitera les données

    1. Posisionnement sur une page correspondant à un enregistrement
    2. Récupération de l'identifiant de la page
    3. Recherche de l'enregistrement en base de données
    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
     
    Public Function LireTo_Print(Byval Id as integer) As to_printMappage
        Dim StrConn As New OleDbConnection
        Dim CmdSql As New OleDbCommand
        Dim DataRdr As OleDbDataReader
        Dim StrSql As String
        Dim arrLigneTo_Print As ArrayList
     
        Try
            StrConn = New OleDbConnection("Provider=Microsoft.Jet.OleDB.4.0; Data Source=Signs.mdb; User Id=; Password=;Mode=Share Deny None;")
     
            If (StrConn.State = ConnectionState.Closed) Then
                StrConn.Open()
            End If
     
            StrSql = "SELECT * FROM to_print where id = @Id"
            CmdSql = New OleDbCommand(StrSql, StrConn)
            CmdSql.AddParameter("@Id", id)
            DataRdr = CmdSql.ExecuteReader()
     
            If (DataRdr.HasRows = False) Then Exit Try
     
            if DataRdr.Read()
                return New to_printMappage().LireDataReader(DataRdr)
            End If
            
            ' Il n'y a aucun enregistrement corerspondant à l'id. passé en paramètre
            Return Nothing
     
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "To_Print")
        Finally
            ' Close the connection when no longer needed
            '
            DataRdr.Close() ' Je te conseille de fermer ton datareader dans le finally
            CmdSql.Connection.Close()
            'CmdSql.Dispose()
        End Try
    End Function
    4. Passage de la classe de mappage à la classe PrintDocument
    ...

  7. #7
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par Kelpan
    J'ai un peu de mal à suivre et à comprendre.

    - Tu as un écran avec plusieurs pages sur lesquels tu peux naviguer ?
    - Chaque page correspond à un enregistrement de la table to_Print ?
    - Le numéro dans la page dont tu parles est-ce l'identifiant de ton enregistrement ?
    - Peux-tu imprimer plusieurs pages à la fois ?
    Je te remercie de prendre la peine de m'aider comme tu le fais. Crois-moi, c'est très apprécié. Si c'est moi qui ne suis pas claire, je te demande pardon... Pour répondre à tes questions, au meilleur de mes connaissances et le plus précisément possible (je l'espère):

    -En fait, la table To_print est une table temporaire générée par la sélection de l'utilisateur dans les données d'une autre table. Une sorte de SELECT INTO associé à un écran de sélection/navigation séparé. C'est à partir de la table générée que je fais mon impression, une sorte de traitement en lot, quoi!

    -Effectivement, chaque page correspond à un enregistrement de la table to_Print. Mon but est que la variable Me.currentPage corresponde à un numéro d'enregistrement duquel j'extrais les données pour les imprimer, à la fin du code de ma procédure OnPrintPage j'ai ce code:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    If (Me.currentPage < Me.totalPages) Then
                    e.HasMorePages = True
                    Me.currentPage = Me.currentPage + 1 
       ' On incrémente le compteur et on passera à l'enregistrement suivant sur 
       ' tout le code qui précède le IF pour sortir la fiche suivante
                Else
                    e.HasMorePages = False
                End If

    -Et oui, le numéro dans la page dont je parle est bien l'identifiant de mon enregistrement, donc un enregistrement donne une page...

    -Pour finir, à ta question «Peux-tu imprimer plusieurs pages à la fois ?» je réponds que j'imprime autant de pages qu'il y a d'enregistrements insérés dans la table To_print (avec code pour annuler le traitement si la table est vide, par exemple l'utilisateur a oublié d'enregistrer sa requête et clique sur le bouton Lancer l'impression... )

    Et j'ajouterais que, ne connaissant pas beaucoup les particularités de la classe PrintDocument (et surtout avec ADO.NET), au premier coup d'oeil j'ai du mal à m'imaginer comment un DataReader me permettrait d'aller pile à l'enregistrement X pour imprimer la page X tandis que le peu que je connais présentement du DataSet me laisse croire que j'y arriverais plus facilement (en évitant les boucles?), mais je me trompe peut-être... (d'où mes interrogations persistantes, diront plusieurs)

    En espérant avoir enfin pu éclairer ta lanterne avec mes réponses à tes questions, et en te remerciant encore pour tes lumières.
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

  8. #8
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut J'ai trouvé ce que je cherche dans les DataSet
    @Kelpan:

    Merci encore pour tes commentaires et tes suggestions pour m'aider dans l'implantation d'un DataReader.

    J'espère ne pas trop t'avoir déçu si j'ai finalement opté pour un DataSet, car j'ai trouvé la réponse à mes questions dans le merveilleux cours VB.NET, plus précisément dans cette page.

    Et encore plus précisément ici:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Me.Nom.Text = ObjetDataTable.Rows(RowNumber).Item("Nom").ToString
    Me.Prenom.Text = ObjetDataTable.Rows(RowNumber).Item("Prenom").ToString
    ' Avec RowNumber = Me.currentPage - 1

    Bien que j'utilise ma table en lecture seulement, cela répond à mon besoin, qui est de pouvoir «tomber pile» sur le numéro d'enregistrement auquel je suis rendue au fur et à mesure que les pages s'impriment.






    J'ai honte, car la réponse se trouvait «dans ma cour» et j'ai cherché ailleurs...
    Anne, citoyenne canadienne
    Informaticienne, altiste et radioamateur... bref, originale
    Lire les règles...
    Un petit rappel: Je ne réponds à aucune question technique posée par MP

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

Discussions similaires

  1. Server : msg 241 "Problème avec les dates"
    Par saadou dans le forum Développement
    Réponses: 4
    Dernier message: 12/07/2009, 20h24
  2. [Web Service][SOAP] Où est l'erreur ? Problème avec SOAP
    Par lauryk dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 14/09/2007, 23h11
  3. Réponses: 5
    Dernier message: 11/06/2007, 13h23
  4. [VB.NET] Problème avec DataReader..?
    Par Pleymo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/03/2005, 19h30
  5. [.NET][GLUT] problème avec iostream
    Par polonain2 dans le forum OpenGL
    Réponses: 7
    Dernier message: 17/03/2004, 17h24

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