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
相关产品推荐
相关产品推荐

