You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中Dapper操作Access关联两表后DataGridView字段显示异常排查

VB.NET + Dapper + Access 关联查询问题排查与解决

问题根源分析

1. CodeProduct字段未显示的原因

SQL查询返回了CodeProduct字段,但**Stocksout实体类中未定义CodeProduct属性**。Dapper基于属性名映射查询结果,因此查询到的CodeProduct值无法绑定到Stocksout对象,最终DataGridView无法显示该字段。

2. 未选中字段出现在DataGridView的原因

DataGridView默认自动生成列,会显示绑定对象(此处为Stocksout)的所有公共属性。尽管SQL未查询HeaderInvno、CreatedBy等字段,但Stocksout类中存在这些属性,且会被初始化默认值(如数值类型为0、字符串为空),因此DataGridView会自动列出这些属性对应的列。

解决步骤

步骤1:创建查询结果专用DTO

由于查询的是两表关联结果,并非单一实体,需定义DTO(数据传输对象)接收查询结果:

Public Class StocksoutJoinDto
    Public Property Invno As String
    Public Property CodeProduct As String
End Class

步骤2:修改Service层查询方法

将返回类型改为IEnumerable(Of StocksoutJoinDto),让Dapper映射到正确的DTO:

Public Class StocksoutService
    Public Function GetOledbConnectionString() As String
        Return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\dapperdemo.accdb;Persist Security Info=False;"
    End Function

    Public Function GetStockOut() As IEnumerable(Of StocksoutJoinDto)
        Dim sql = "SELECT Stocksout.Invno AS [Invno],StocksoutDetail.CodeProduct AS [CodeProduct] FROM Stocksout INNER JOIN StocksoutDetail ON Stocksout.Invno = StocksoutDetail.Invno"
        Using _conn = New OleDbConnection(GetOledbConnectionString())
            Return _conn.Query(Of StocksoutJoinDto)(sql).ToList()
        End Using
    End Function
End Class

注:原类中_conn字段和构造函数初始化代码为冗余逻辑,已删除

步骤3:(可选)手动控制DataGridView列

若不想使用DTO,可保留原实体,通过以下方式调整:

  1. 在Stocksout类中添加CodeProduct属性:
Public Class Stocksout
    Public Property Invno() As String
    Public Property CodeProduct() As String ' 添加该属性
    Public Property HeaderInvno() As Integer
    Public Property CreatedBy() As String
    Public Property Created() As DateTime
    Public Property ModifiedBy() As String
    Public Property Modified() As DateTime
    Public Property StocksoutDetail() As New List(Of StocksoutDetail)()
End Class
  1. 关闭DataGridView自动列生成,手动添加需显示的列:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.AutoGenerateColumns = False ' 关闭自动列生成
    ' 添加需要显示的列并绑定属性
    DataGridView1.Columns.Add("Invno", "单据编号")
    DataGridView1.Columns("Invno").DataPropertyName = "Invno"
    DataGridView1.Columns.Add("CodeProduct", "产品编码")
    DataGridView1.Columns("CodeProduct").DataPropertyName = "CodeProduct"
    
    DataGridView1.DataSource = sosservice.GetStockOut()
End Sub

额外提示

  • Dapper映射大小写不敏感,但属性名需与查询别名一致(SQL中AS [Invno]对应DTO的Invno属性)。
  • 推荐使用DTO方式,更符合单一职责原则,避免实体类冗余。

内容的提问来源于stack exchange,提问作者roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:38:13