3 votes

Impossible d'afficher la requête PostgreSQL en tant que Combobox dans Visual Basic.net

J'ai une requête qui s'exécute parfaitement dans Postgresql :

SELECT 
      matchid
    , f1.firstname
    , f1.lastname
    , f2.firstname
    , f2.lastname
FROM matches AS m
    INNER JOIN fighters AS f1
        ON f1.fighterid = m.fighteroneid
    INNER JOIN fighters AS f2
        ON f2.fighterid = m.fightertwoid

Il affiche une ligne avec les combattants, mais lorsque j'essaie d'afficher les résultats dans une liste déroulante, cela s'affiche comme "System.Data.DataRow" au lieu des données.

Code en VB.NET:

mySelectQuery = "SELECT f1.firstname, f1.lastname, f2.firstname, f2.lastname FROM matches AS m INNER JOIN fighters AS f1 ON f1.fighterid = m.fighteroneid INNER JOIN fighters AS f2 ON f2.fighterid = m.fightertwoid"

pgAdapter = New PgSqlDataAdapter(mySelectQuery, pgConnection)
    pgAdapter.Fill(dtMatches)

    With cboMatches
        .DisplayMember = "fighters"
        .ValueMember = "matchid"
        .DataSource = dtMatches
        .SelectedIndex = -1

J'ai essayé d'utiliser fighters, m, f1, f2 comme membre d'affichage et j'obtiens toujours la même sortie.

Si je place .DataSource au-dessus de .DisplayMember, je reçois l'erreur : Impossible de lier au nouveau membre d'affichage. Nom du paramètre : newDisplayMember.

Merci d'avance,

Spence

2voto

Steve Points 96477

ValueMember et DisplayMember devraient faire référence aux noms de colonnes de votre source de données.
Vous n'avez rien avec les noms attribués.
Vous pourriez essayer d'attribuer un nom au DisplayMember, mais votre requête ne produit aucun MatchID.

Je ne suis pas un expert en PostegreSQL, mais vous pourriez essayer ce qui suit pour agréger les noms

mySelectQuery = "SELECT m.MatchID, string_agg(f1.firstname, f1.lastname, ' - ', " + 
                "f2.firstname, f2.lastname, ' ') as Fighters " + 
                "FROM matches AS m INNER JOIN fighters AS f1 ON f1.fighterid = m.fighteroneid" +
                " INNER JOIN fighters AS f2 ON f2.fighterid = m.fightertwoid"

et ensuite utiliser

With cboMatches  
    .DisplayMember = "Fighters"  
    .ValueMember = "MatchID"  
    .DataSource = dtMatches  
    .SelectedIndex = -1  
End With

2voto

Spence Points 125

J'ai fini par utiliser COALESCE parce que string_agg ne fonctionne pas avec le type de nom sans CASTS.

SELECT m.MatchID, COALESCE(f1.firstname || ' ' || f1.lastname || ' - ' || f2.firstname || ' ' ||  f2.lastname) as Fighters  
       FROM matches AS m INNER JOIN fighters AS f1 ON f1.fighterid = m.fighteroneid 
       INNER JOIN fighters AS f2 ON f2.fighterid = m.fightertwoid

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X