3

我有一个在 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

它与战斗机一起显示一行,但是当我尝试在组合框中显示结果时,它显示为“System.Data.DataRow”而不是数据。

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
    End With

我尝试使用战斗机 m、f1、f2 作为显示成员,它总是返回相同的输出。

如果我将 .DataSource 移到 .DisplayMember 上方,我会收到错误消息:无法绑定到新的显示成员。参数名称:newDisplayMember。

先感谢您,

斯宾塞

4

2 回答 2

2

ValueMember 和 DisplayMember 应该引用数据源的列名。
您没有任何分配的名称。
您可以尝试为 DisplayMember 分配一个名称,但您的查询不会产生任何 MatchID。

我不是 PostegreSQL 方面的专家,但是,您可以尝试以下方法来汇总名称

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"

然后使用

With cboMatches  
    .DisplayMember = "Fighters"  
    .ValueMember = "MatchID"  
    .DataSource = dtMatches  
    .SelectedIndex = -1  
End With  
于 2012-10-20T13:38:23.180 回答
2

我最终使用了 COALESCE,因为 string_agg 不适用于没有 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
于 2012-10-20T14:17:55.430 回答