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

VB.NET如何将DB2数据读取到Dictionary并实现更新插入?

解决方案

1. 确定Dictionary的键

选择SQL查询中的ITEMID作为Dictionary的唯一键(确保ITEMID无重复,若为数值类型需转成字符串),最终结构为Dictionary(Of String, LotDTO),键对应ITEMID的值,值为对应的LotDTO对象。

2. 修改数据读取逻辑,填充Dictionary

保留原有的LotDTO字段映射逻辑,将数据添加到Dictionary中,同时处理键的唯一性:

' 初始化Dictionary
Dim LotsDict As New Dictionary(Of String, LotDTO)

Using db2reader As OdbcDataReader = db2Com.ExecuteReader
    While db2reader.Read
        ' 提取唯一键ITEMID
        Dim itemId As String = If(IsDBNull(db2reader("ITEMID")), "", db2reader("ITEMID").ToString())
        
        ' 创建LotDTO对象,补充SQL中所有列的映射
        Dim lotDto As New LOTDTO With {
            .ItemId = itemId,
            .LotNo = If(IsDBNull(db2reader("dlot")), "", db2reader("dlot").ToString()),
            .ExpDate = If(IsDBNull(db2reader("ExpDate")), "", db2reader("ExpDate").ToString()),
            .TrxDate = If(IsDBNull(db2reader("TRXDATE")), "", db2reader("TRXDATE").ToString()),
            .TrxType = If(IsDBNull(db2reader("TRXTYPE")), "", db2reader("TRXTYPE").ToString()),
            .ReferNo = If(IsDBNull(db2reader("REFERNO")), "", db2reader("REFERNO").ToString())
            ' 其他列按此格式补充
        }
        
        ' 避免重复键报错
        If Not LotsDict.ContainsKey(itemId) Then
            LotsDict.Add(itemId, lotDto)
        Else
            ' 可选:处理重复键,比如覆盖或提示
            Console.WriteLine($"发现重复ITEMID:{itemId},已跳过")
        End If
    End While
End Using

3. 获取查询列名(用于后续重建记录)

通过OdbcDataReader的FieldCount和GetName方法直接获取所有列名,适合新手快速实现:

Dim columnNames As New List(Of String)()

Using db2reader As OdbcDataReader = db2Com.ExecuteReader
    ' 遍历所有字段,收集列名
    For i As Integer = 0 To db2reader.FieldCount - 1
        columnNames.Add(db2reader.GetName(i))
    Next
    
    ' 后续读取数据填充Dictionary的逻辑放在这里
End Using

4. 绑定到DataGridView

直接将Dictionary的Values集合转成List后绑定:

DataGridView1.DataSource = LotsDict.Values.ToList()

5. 修改后插入新记录的实现思路

有了列名列表和LotDTO数据,可按以下步骤操作:

  • 从DataGridView获取修改后的行,转换为LotDTO对象
  • 用列名列表拼接INSERT语句的字段部分,推荐使用参数化查询避免SQL注入:
    ' 拼接字段和参数占位符
    Dim insertFields As String = String.Join(", ", columnNames)
    Dim paramPlaceholders As String = String.Join(", ", columnNames.Select(Function(c) $"@{c}"))
    Dim insertSql As String = $"INSERT INTO DB ({insertFields}) VALUES ({paramPlaceholders})"
    
    ' 给参数赋值
    db2Com.CommandText = insertSql
    db2Com.Parameters.Clear()
    For Each colName In columnNames
        Dim propValue = lotDto.GetType().GetProperty(colName).GetValue(lotDto)
        ' 处理DBNull情况
        db2Com.Parameters.AddWithValue($"@{colName}", If(IsDBNull(propValue) OrElse propValue Is Nothing, DBNull.Value, propValue))
    Next
    
    ' 执行插入
    db2Com.ExecuteNonQuery()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:35:33