You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Visual Basic向Microsoft Access链接表插入数据失败求助

解决Access链接表数据插入失败的问题

看了你的代码,我发现几个关键问题导致数据没有插入到数据库里,咱们一步步来修正:

1. 最核心的问题:没有执行插入命令

你在登录代码里调用了cmd.ExecuteNonQuery()来触发插入操作,但在medication_input方法里,创建完插入命令并添加参数后,直接就cmd.Dispose()了——完全没告诉数据库要执行这个插入操作!这是数据没插入的首要原因。

2. 冗余且有问题的循环逻辑

你写的Do Until循环完全没必要,因为最后直接设置stop_loop = True,循环只会执行一次。而且如果查询Student ID时没找到匹配数据(reader.Read()返回False),test变量是空的,这时候依然会执行插入,导致插入无效的Student ID。

3. 缺失异常处理

没有Try-Catch块的话,即使代码出错你也看不到错误提示,比如连接没打开、参数类型不匹配这类问题都会悄悄失败,你根本不知道哪里出了问题。

4. 连接状态确认

要确保myconnection在执行操作前是处于打开状态的,就像你登录代码里做的那样,否则所有数据库操作都会直接失败。

修改后的完整代码

Private Sub medication_input()
    Dim str As String
    Dim cmd As OleDbCommand
    Dim test As String = String.Empty ' 初始化默认值,避免空引用
    Dim studentFound As Boolean = False

    ' 先确保数据库连接是打开的
    If myconnection.State <> ConnectionState.Open Then
        myconnection.Open()
    End If

    Try
        ' 用参数化查询获取Student ID,避免SQL注入和字符串拼接问题
        str = "SELECT [Student ID] FROM [Student data] WHERE [Student First Name] = ? AND [Student Last Name] = ? AND [Form group] = ?;"
        cmd = New OleDbCommand(str, myconnection)
        cmd.Parameters.Add(New OleDbParameter("FirstName", CType(Student_FN.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("LastName", CType(Student_LN.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("FormGroup", CType(Form.SelectedItem, String)))

        Dim reader As OleDbDataReader = cmd.ExecuteReader
        If reader.Read Then
            test = reader("Student ID").ToString
            studentFound = True
        Else
            MsgBox("未找到匹配的学生信息,请检查输入!")
        End If
        reader.Close() ' 用完DataReader记得关闭,释放资源
        cmd.Dispose()

        ' 只有找到有效学生时才执行插入操作
        If studentFound Then
            str = "Insert into [Student + Medication] ([Student ID],[Medical ID]) values(?,?)"
            cmd = New OleDbCommand(str, myconnection)
            
            ' OleDb参数是按位置匹配的,顺序要和SQL语句里的?对应
            cmd.Parameters.Add(New OleDbParameter("StudentID", CType(test, String)))
            Select Case Medication.SelectedItem.ToString
                Case "Bricanul"
                    cmd.Parameters.Add(New OleDbParameter("MedicalID", CType("1", String)))
                Case "Symbricort"
                    cmd.Parameters.Add(New OleDbParameter("MedicalID", CType("2", String)))
                Case Else
                    cmd.Parameters.Add(New OleDbParameter("MedicalID", CType("3", String)))
            End Select

            ' 关键:执行插入命令
            cmd.ExecuteNonQuery()
            MsgBox("数据插入成功!")
            cmd.Dispose()
        End If
    Catch ex As Exception
        MsgBox("操作出错:" & ex.Message) ' 捕获错误并提示,方便排查
    Finally
        ' 无论是否出错,都确保关闭数据库连接,避免资源占用
        If myconnection.State = ConnectionState.Open Then
            myconnection.Close()
        End If
    End Try
End Sub

额外优化点说明

  • 把查询Student ID的语句改成了参数化查询,既避免了SQL注入风险,也解决了学生姓名含特殊字符(比如单引号)导致的SQL语法错误。
  • Select Case替代多个ElseIf,代码结构更清晰易读。
  • 添加了DataReader的关闭操作和Finally块关闭连接,避免数据库资源泄漏。

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

火山引擎 最新活动