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

执行INSERT...ON DUPLICATE KEY UPDATE时触发System.NullReferenceException报错求助

解决System.NullReferenceException在MySQL UPSERT操作中的问题

嘿,我来帮你揪出这个空引用异常的根源。结合你给出的代码和场景,大概率是这几个环节出了问题,咱们一步步来排查:

1. 先确认itm1是否有效

你这段代码里用到的itm1应该是ListView的某一项吧?如果它是Nothing(比如没有选中任何项,或者遍历的时候拿到了空的ListViewItem),那访问它的Text或者SubItems肯定会抛出空引用异常。

解决办法:在执行数据库操作前先做个判断:

If itm1 Is Nothing Then
    MessageBox.Show("请先选择要更新的记录哦!")
    Return
End If

2. 检查数据库连接conn2的状态

如果conn2没有被正确实例化(是Nothing),或者连接已经关闭了,那创建MySqlCommand的时候也会出问题。

解决办法:确保连接是可用的:

If conn2 Is Nothing OrElse conn2.State <> ConnectionState.Open Then
    ' 重新初始化连接,记得替换成你的实际连接字符串
    conn2 = New MySqlConnection("server=xxx;user=xxx;password=xxx;database=xxx")
    conn2.Open()
End If

3. 验证ListView的SubItems数量是否足够

你用到了SubItems(1)到SubItems(7),意味着你的ListView至少要有8列(因为itm1.Text对应SubItems(0))。如果某一行的SubItems数量不足,访问超出范围的索引就会触发空引用。

解决办法:添加数量检查:

If itm1.SubItems.Count < 8 Then
    MessageBox.Show("这条记录的字段不完整,请检查后再操作!")
    Return
End If

4. 空白值的参数处理优化

虽然你的功能允许空白,但如果MySQL的字段允许为NULL,直接传空字符串可能不如传DBNull.Value规范,也能避免一些潜在的参数绑定问题。

解决办法:修改参数添加逻辑,比如:

.Parameters.AddWithValue("@entryno", If(String.IsNullOrEmpty(itm1.Text), DBNull.Value, itm1.Text))
.Parameters.AddWithValue("@empid2", If(String.IsNullOrEmpty(itm1.SubItems(1).Text), DBNull.Value, itm1.SubItems(1).Text))
' 其他参数都照这个格式处理

5. 用Using语句管理资源(推荐)

为了避免对象生命周期混乱导致的异常,建议用Using语句自动释放数据库连接和命令对象:

Using conn2 As New MySqlConnection("你的连接字符串")
    conn2.Open()
    Using cmd6 As New MySqlCommand(cs, conn2)
        .CommandText = "INSERT INTO workrecord (entryno, empid2, position, company, sdate, edate, yoservice, reason)" _
        & "VALUES (@entryno, @empid2, @position, @company, @sdate, @edate, @yoservice, @reason)" _
        & "ON DUPLICATE KEY UPDATE entryno = @entryno, empid2 = @empid2, position = @position, company = @company, sdate = @sdate, edate = @edate, yoservice = @yoservice, reason = @reason"
        
        ' 这里添加参数的代码
        .Parameters.AddWithValue("@entryno", If(String.IsNullOrEmpty(itm1.Text), DBNull.Value, itm1.Text))
        ' ...其他参数
        
        .ExecuteNonQuery()
    End Using
End Using

6. 添加异常捕获定位问题

如果还是不确定哪里错了,给代码加个异常捕获,能直接看到出错的具体位置:

Try
    ' 你的数据库操作代码放在这里
Catch ex As NullReferenceException
    MessageBox.Show($"空引用异常详情:{ex.Message},出错位置:{ex.StackTrace}")
Catch ex As MySqlException
    MessageBox.Show($"数据库错误:{ex.Message}")
Catch ex As Exception
    MessageBox.Show($"其他错误:{ex.Message}")
End Try

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:42:40