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

ASP.NET Discussion :

Problème C# Npgsql [Débutant]


Sujet :

ASP.NET

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut Problème C# Npgsql
    Bonjour à tous,

    J'ai un petit problème avec mon code C# utilisant du Npgsql. Je veux pouvoir faire une recherche à l'aide d'une variable qui sera fourni par un autre logiciel (Intuiface), le problème c'est que j'ai rien qui s'affiche dans ce dernier et je ne sais pas d'ou peut venir l'erreur en sachant que Visual Studio génère sans trouver d'erreur dans le code. Voici mon code :

    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
     
    public void search(string productName)
            {
                NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;");
                conn.Open();
     
                NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM product_product WHERE default_code = :productName;", conn);
                command.Parameters.Add(new NpgsqlParameter("productName", NpgsqlDbType.Text));
                command.Parameters[0].Value = productName;
     
                NpgsqlDataAdapter myDataAdapter = new NpgsqlDataAdapter();
                DataSet ds = new DataSet();
                myDataAdapter.InsertCommand = command;
                myDataAdapter.Fill(ds, "product_product");
     
                foreach (DataRow dr in ds.Tables["product_product"].Rows)
                {
                    MyData d = new MyData()
                    {
                        Id = dr[0].ToString(),
                        defaultCode = dr[9].ToString(),
                        nameTemplate = dr[10].ToString(),
                    };
                    MyDataList.Add(d);
                }
                conn.Close();
            }
    Je vous remercie par avance pour l'aide apportée,

    Alexandre.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    En me relisant je me suis rendu compte qu'il n'y a pas vraiment de question, je voudrais juste savoir si mon code va bien retourner le résultat attendu. Si d'après vous le code est bon c'est que le problème viendrait surement de Intuiface (le soft à qui est destiné ce code).

    C'est pour un projet de stage et la je commence à dangereusement me rapprocher de la date butoir et le Npgsql n'est vraiment pas simple a prendre en main...

    Je vous remercie pour votre aide,

    Alexandre

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut
    Bonjour,

    Est ce que cette version là fonctionne? Je ne connais pas bien les Adapter donc j'ai utilisé un DataReader qui est, je trouve, plus simple.

    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
     
            public void search(string productName)
            {
                using (NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;"))
                {
                    conn.Open();
     
                    NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM product_product WHERE default_code = :productName;", conn);
                    command.Parameters.Add(new NpgsqlParameter("productName", NpgsqlDbType.Text));
                    command.Parameters[0].Value = productName;
                    using (NpgsqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            MyDataList.Add(new MyData
                            {
                                Id = reader.GetString(0),
                                defaultCode = reader.GetString(9),
                                nameTemplate = reader.GetString(10)
                            });
                        }
                    }
                }
            }
    2, 3 remarques sur le code.
    Toujours utiliser un "using" la où c'est possible, il te permet d'être sur que ta connexion et ton reader soient bien Disposer même en cas d'exception.
    Si tu n'as besoin que de ces 3 champs de ta table SQL spécifient les dans ta query. Le "select * from" est a éviter autant que possible. Le query sera plus efficace et plus rapide car moins de données à récuper.

    J'espère t'avoir aidé.
    Max.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    Bonjour MxDeg et merci pour ta réponse,

    Malheureusement ça ne marche pas. Le myDataList est un ObservableCollection, je dois stocker les information de ma base dans un tableau pour pouvoir les faire afficher par Intuiface c'est pour cela que j'utilisais un Dataset et un DataAdapter car dans ma tête ça correspondait avec le fait de remplir un tableau (le DataSet est le tableau en question qui est rempli par le DataAdapter, enfin c'est comme ça que je les compris, j'en ai jamais fait avant).

    Merci aussi pour tes remarques à la fin du post même si le using je ne le comprends pas trop.

    Un autre exemple qui se trouve autre part dans mon code et qui fonctionne bien :

    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
     
    public void GenerateMockData()
            {
                NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;");
                conn.Open();
     
                NpgsqlDataAdapter myDataAdapter = new NpgsqlDataAdapter("SELECT * FROM product_product;", conn);
                DataSet ds = new DataSet();
                myDataAdapter.Fill(ds, "product_product");
     
                foreach (DataRow dr in ds.Tables["product_product"].Rows)
                {
                    MyData d = new MyData()
                    {
                         Id = dr[0].ToString(),
                        defaultCode = dr[1].ToString(),
                        nameTemplate = dr[2].ToString(),
                        //listPrice = dr[3].ToString(),
                        //supplyMethod = dr[8].ToString(),
                        //image = dr [10].ToString()
                    };
                    MyDataList.Add(d);
                }
                conn.Close();
            }
    Ici tout fonctionne parfaitement, j'avais espéré faire à peu la même chose mais on dirait que ça coince au moment ou je veux faire entrer une variable de l'extérieur. La seule chose dans le code du dessus que je n'arrive pas à faire est d'afficher l'image, mais ça c'est une autre histoire...

    Avez vous d'autres idées à me proposer?

    Merci par avance pour l'aide apportée,
    Alexandre.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut
    Je vois déjà qu'il y a une différence au niveau de la récupération des données entre les 2 exemples.
    D'un coté il y a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    defaultCode = dr[1].ToString(),
    nameTemplate = dr[2].ToString(),
    et de l'autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    defaultCode = dr[9].ToString(),
    nameTemplate = dr[10].ToString(),
    Les indices des tableaux ne correspondent pas. As-tu essayé de déboguer ton code? Le paramètre de ton query est-il correct? Essaye d’exécuter le query avec le paramètre que tu reçois dans pgAdmin pour voir le résultat.
    Le fait que myDataList soit une IbservableCollection ne change rien au problème et n'empêche pas l'utilisation du DataReader.

    "using" est un mot-clé qui en gros va s'assurer que la méthode "Dispose" soit toujours appelée et dans le cas de connexion SQL le "Dispose" ferme la connexion. En gros il va entourer ton code avec un try {} catch {} finally {} et appeler le "Dispose" dans le finally.
    Je te conseille de te renseigner sur le pattern Disposable (interface IDisposable), c'est très intéressant. Ça permet de libérer proprement les ressources (managés ou non).

    Max.
    http://msdn.microsoft.com/fr-fr/libr...v=vs.110).aspx

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    Bonjour à tous,

    Dsl MxDeg pour le fouillis au niveau des noms de variables... En fait pour le moment j'utilise les même noms de variables pour des tables différentes, mes variables ont été créées automatiquement via l'Entity Framework, elles sont dans une classe et j'utilise les même pour l'instant car je n’exécute pas toutes les méthodes en même temps.

    Je vais faire ce que tu m'as recommander avec pgAdmin, c'est vrai que j'avais pas pensé à le faire pour voir si la méthode fonctionne bien (je ne l'ai jamais utilisé, je suis un utilisateur Linux d'habitude donc je testais les requêtes en ligne de commande...

    Merci pour le lien sur le "Dispose" je regarderai de quoi ça parle.

    Cordialement,
    Alexandre.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    Donc, la requête fonctionne bien sous pgAdmin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM product_product WHERE default_code = 'KeyQ';
    Après le problème c'est que je ne peux pas voir si c'est le passage de paramètre qui ne fonctionne pas, j'ai peur que ce soit ça qui coince.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut
    Tu ne peux pas lancer ton application en mode debug et mettre un breakpoint dans la méthode "search"?

    Max.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    C'est un projet en mode 'bibliothèque de classe' donc non je ne peux pas lancer le mode debug, peut-être, juste pour tester la méthode "search", je pourrait ajouter un main est voir si l'appli se lance bien et affiche ce qu'il faut avec un DataReader. Je vais essayer de voir ça.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    J'ai testé mon code dans une application console et il fonctionne bien, voici le code utilisé :

    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
     
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Data;
    using Npgsql;
    using NpgsqlTypes;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace ConsoleTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Program prog = new Program();
                String var = "KeyQ";
                prog.run(var);
            }
            public class MyData
            {
                private Int32 _Id;
                public Int32 Id
                {
                    get { return _Id; }
                    set { _Id = value; }
                }
     
                private string _defaultCode;
                public string defaultCode
                {
                    get { return _defaultCode; }
                    set { _defaultCode = value; }
                }
     
                private string _nameTemplate;
                public string nameTemplate
                {
                    get { return _nameTemplate; }
                    set { _nameTemplate = value; }
                }
            }
     
            private ObservableCollection<MyData> _MyDataList;
            public ObservableCollection<MyData> MyDataList
            {
                get { return _MyDataList; }
                set { _MyDataList = value; }
            }
     
     
            public void run(string productName)
            {
                using (NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;"))
                {
                    conn.Open();
     
                    NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM product_product WHERE default_code = :productName;", conn);
                    command.Parameters.Add(new NpgsqlParameter("productName", NpgsqlDbType.Text));
                    command.Parameters[0].Value = productName;
     
                    using (NpgsqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                Console.Write("{0} \t", reader[i]);
                            }
                            Console.WriteLine();
                        }
                    }
                    Console.ReadKey(true);
                    conn.Close();
                }
     
            }
        }
    }
    Donc si ça sa marche ça veut bien dire que ce n'est pas mon passage de paramètre qui est en cause ? Se serait donc soit le fait de les enregistrer dans myDataList soit moi qui fait pas ce qu'il faut sous Intuiface.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Par défaut
    En effet ça ne vient pas de ce morceau de code.
    Il te reste 2 possibilités:
    . d'où provient le paramètre de la méthode search (intuiface)? Est-ce qu'il est correct (bonne valeur)?
    . Intuiface requière une ObservableCollection? L’intérêt d'une ObservableCollection vient de l’événement "CollectionChanged" qui permet de savoir si la collection a été modifiée. Il faudrait être sur que Intuiface s'abonne bien à cet événement.

    Sans code a analyser et comme je ne connais psa intuiface je ne peux pas t'aider plus malheureusement.

    Max.

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    Le ObservableCollection je l'ai trouvé en faisant une recherche sur une façon de stocker mes données (comme un tableau), je l'avais trouvé dans un exemple de code fonctionnant sous Intuiface donc je l'ai repris sans trop me poser de question. Voici le bout de code complet :

    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
     
    public class Mock_Database_CS : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
     
            private ObservableCollection<MyData> _MyDataList;
            public ObservableCollection<MyData> MyDataList
            {
                get { return _MyDataList; }
                set { _MyDataList = value; }
            }
     
     
            public Mock_Database_CS()
            {
                MyDataList = new ObservableCollection<MyData>();
            }
     
     
            //Methode pour récupérer les images
            //Elles seront placées dans un caroussel sous Intuiface
     
     
            //This method is only for test purpose.
            //Replace it with thec ode needed to retrieve the data from your database
            public void GenerateMockData()
            {
                NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;");
                conn.Open();
     
                NpgsqlDataAdapter myDataAdapter = new NpgsqlDataAdapter("SELECT * FROM product_product;", conn);
                DataSet ds = new DataSet();
                myDataAdapter.Fill(ds, "product_product");
     
                foreach (DataRow dr in ds.Tables["product_product"].Rows)
                {
                    MyData d = new MyData()
                    {
                        Id = dr[0].ToString(),
                        defaultCode = dr[1].ToString(),
                        nameTemplate = dr[2].ToString(),
                        //listPrice = dr[3].ToString(),
                        //supplyMethod = dr[8].ToString(),
                    };
                    MyDataList.Add(d);
                }
                conn.Close();
            }
     
     
            public void search(string productName)
            {
                using (NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;"))
                {
                    conn.Open();
     
                    NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM product_product WHERE default_code = :productName;", conn);
                    command.Parameters.Add(new NpgsqlParameter("productName", NpgsqlDbType.Text));
                    command.Parameters[0].Value = productName;
                    using (NpgsqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            MyDataList.Add(new MyData
                            {
                                Id = reader.GetString(0),
                                defaultCode = reader.GetString(9),
                                nameTemplate = reader.GetString(10)
                            });
                        }
                    }
                }
            }
     
            public void ClearList()
            {
                MyDataList.Clear();
            }
    }
    Si ça peut poser problème je le change, à vrai dire je prenais ça comme un simple tableau. Au départ je pensais utiliser une List mais comme dans la base en question se trouve plusieurs type de données (bytea, int, varchar...) je ne savais pas trop comment l'utiliser. Il y a un autre moyen simple ou l'on peut ranger tout un tas de données de typer différents ?

    Merci pour votre aide,
    Alexandre.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Par défaut
    Merci MxDeg pour votre aide, le problème est résolu. Bizarrement j'ai quasiment rien changé, j'ai jouté un using devant la commande et j'ai changé ma variable Id en Int32... Voici ce que donne mon code :

    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
     
            public void search(string productName)
            {
                using (NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;"))
                {
                    conn.Open();
     
                    using (NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM product_product WHERE default_code = :productName;", conn))
                    {
                        command.Parameters.Add(new NpgsqlParameter("productName", NpgsqlDbType.Text));
                        command.Parameters[0].Value = productName;
     
                        using (NpgsqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                MyDataList.Add(new MyData
                                {
                                    Id = reader.GetInt32(0),
                                    defaultCode = reader.GetString(9),
                                    nameTemplate = reader.GetString(10)
                                });
                            }
                        }
                        conn.Close();
                    }
                }
            }
    Cordialement,
    Alexandre.

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

Discussions similaires

  1. Npgsql et EdmGen2 => problème génération EDMX
    Par takinelinfo dans le forum Accès aux données
    Réponses: 4
    Dernier message: 25/07/2011, 14h58
  2. Problème de transaction avec nPgSql
    Par GloRex dans le forum Accès aux données
    Réponses: 2
    Dernier message: 19/01/2011, 10h43
  3. Problème de paramétrage de SQL avec NpgSQL.
    Par Jean-Marc68 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 17/12/2007, 11h36
  4. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18

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