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

