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

Visual Basic向Access数据库添加记录遇ConnectionString不可修改报错如何解决

报错原因

  • 你将myconnection定义为类级别的全局OleDb连接对象,第一次触发按钮点击事件打开连接后如果没有正常关闭,后续再次点击时连接仍处于打开状态,此时修改ConnectionString属性就会触发该报错。
  • 代码还存在其他逻辑问题:
    1. cmd变量在If代码块内部声明,块外的Try-Catch无法访问该变量,运行时会触发变量未定义错误
    2. 同时使用SQL字符串拼接和参数注入,属于冗余写法,还存在SQL注入风险
    3. 高分判断逻辑写反:当前分数大于历史高分时,你将当前分数的标签赋值为了历史高分,逻辑完全颠倒
    4. 全局长期持有数据库连接不符合ADO.NET开发规范,容易引发各类连接异常

修复方案

  1. 废弃全局连接对象,每次操作数据库时在方法内部创建连接,使用后立即销毁
  2. 统一使用参数化查询,不要手动拼接SQL语句
  3. 修正高分赋值逻辑
  4. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:24:06