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

SQLite连接释放报错:如何在Finally中安全关闭连接并卸载窗体

SQLite连接释放错误解决:Cannot access a disposed object.

问题场景

向SQLite数据库插入数据时,数据导入阶段运行正常,但在Finally块的SQLiteConnection.Close()行抛出**"Cannot access a disposed object."**错误。需求是无论数据导入成功或失败,最终都要关闭连接并卸载窗体。

原错误代码

Private SQLitecnStr As String = "Data Source=XXXXXXX; Integrated Security=true"
Private SQLiteConnection As New SQLiteConnection(SQLitecnStr)
Private SQLiteCommand As New SQLiteCommand(SQLiteConnection)

Public Sub ExecuteNonQuery(SQLQuery As String, TargetForm As Form)

    Try

        Using SQLiteConnection
            Using SQLiteCommand
                SQLiteConnection.Open()
                SQLiteCommand.CommandText = SQLQuery
                SQLiteCommand.ExecuteNonQuery()
            End Using
        End Using

    Catch ex As Exception
        MsgBox("Error: " & vbNewLine & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Warning")
    Finally
        SQLiteConnection.Close()
        TargetForm.Close()
    End Try
    
End Sub

错误原因

原代码使用了类级别的SQLiteConnection和SQLiteCommand对象,同时在Using语句中引用这些对象。Using语句会在代码块结束时自动释放(Dispose)对象资源,导致后续Finally块中调用SQLiteConnection.Close()时,对象已经被销毁,从而抛出“无法访问已释放对象”的异常。

修正后的代码(Jimi提供)

Public Sub ExecuteNonQuery(SQLQuery As String, NotificationOnSuccess As String, NotificationOnError As String, TargetForm As Form)

    Try

        Using SQLiteConnection As New SQLiteConnection(SQLitecnStr)
            Using SQLiteCommand As New SQLiteCommand(SQLiteConnection)
                SQLiteConnection.Open()
                SQLiteCommand.CommandText = SQLQuery
                SQLiteCommand.ExecuteNonQuery()
            End Using
        End Using

        MsgBox(NotificationOnSuccess, MsgBoxStyle.OkOnly Or MsgBoxStyle.Information, "记录添加成功")

    Catch SQLiteException As Exception
        '检查记录是否已存在
        If SQLiteException.Message.Contains("UNIQUE") Then
            MsgBox(NotificationOnError, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "记录已存在")
        Else
            MsgBox("错误: " & vbNewLine & SQLiteException.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "警告")
        End If
    Finally
        TargetForm.Close()
    End Try

End Sub

关键修正说明

  • 使用局部数据库对象:在Using语句内直接创建SQLiteConnection和SQLiteCommand的局部实例,确保Using块结束后自动完成资源释放,无需手动调用Close()。
  • 移除多余的Close()调用:Using语句会自动处理连接的关闭与销毁,Finally块仅保留窗体关闭逻辑,避免访问已释放的对象。
  • 优化异常处理:针对SQLite唯一约束冲突(UNIQUE)添加了针对性提示,提升错误反馈的准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:30:14