Visual Basic向Access数据库添加记录遇ConnectionString不可修改报错如何解决
报错原因
- 你将
myconnection定义为类级别的全局OleDb连接对象,第一次触发按钮点击事件打开连接后如果没有正常关闭,后续再次点击时连接仍处于打开状态,此时修改ConnectionString属性就会触发该报错。 - 代码还存在其他逻辑问题:
cmd变量在If代码块内部声明,块外的Try-Catch无法访问该变量,运行时会触发变量未定义错误- 同时使用SQL字符串拼接和参数注入,属于冗余写法,还存在SQL注入风险
- 高分判断逻辑写反:当前分数大于历史高分时,你将当前分数的标签赋值为了历史高分,逻辑完全颠倒
- 全局长期持有数据库连接不符合ADO.NET开发规范,容易引发各类连接异常
修复方案
- 废弃全局连接对象,每次操作数据库时在方法内部创建连接,使用后立即销毁
- 统一使用参数化查询,不要手动拼接SQL语句
- 修正高分赋值逻辑
- 用
Using语句自动托管连接、命令对象的生命周期,不需要手动调用Dispose、Close方法
修正后完整代码
类定义部分
Imports System.Data.OleDb Public Class Pure ' 仅保留连接字符串作为全局常量复用,删除其余不必要的全局变量 Private Const connstring As String = "provider=microsoft.ACE.OLEDB.12.0;Data Source=flashcard login.accdb"
按钮点击事件部分
Private Sub btnSummary_Click(sender As Object, e As EventArgs) Handles btnSummary.Click ' 先做分数比较,只有当前分数更高时才执行数据库操作 If Integer.Parse(lblScore11.Text) > Integer.Parse(lblHighScore.Text) Then ' 修正逻辑:将历史高分更新为当前分数 lblHighScore.Text = lblScore11.Text ' Using会自动释放数据库连接、命令对象资源 Using myconnection As New OleDbConnection(connstring) Using cmd As New OleDbCommand("insert into results ([score]) values (@score)", myconnection) cmd.Parameters.AddWithValue("@score", lblHighScore.Text) Try myconnection.Open() cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message) End Try End Using End Using End If End Sub
内容的提问来源于stack exchange,提问作者Idk
相关产品推荐
相关产品推荐

