【问题标题】:Can't update my DataGridView using MySql(Xampp) System.InvalidOperationException: 'The connection is already open.'无法使用 MySql(Xampp) System.InvalidOperationException 更新我的 DataGridView:“连接已打开。”
【发布时间】:2021-08-02 17:17:34
【问题描述】:
Imports MySql.Data.MySqlClient
    Public Class Form1
       Dim str As String = "server=127.0.0.1; uid=root; pwd=''; database=dbparkingsystem;"
       Dim con As New MySqlConnection(str)
       Dim cmd As MySqlCommand

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        con.Open()
        Try
            cmd = con.CreateCommand()
            cmd.CommandText = "update profile FirstName=@fName, MiddleName=@mName, LastName=@lName, Position=@pos where EmployeeID=@empID"
            cmd.Parameters.AddWithValue("@empID", TextBox1.Text)
            cmd.Parameters.AddWithValue("@fName", TextBox2.Text)
            cmd.Parameters.AddWithValue("@mName", TextBox3.Text)
            cmd.Parameters.AddWithValue("@lName", TextBox4.Text)
            cmd.Parameters.AddWithValue("@pos", TextBox5.Text)
            cmd.ExecuteNonQuery()
            load()

        Catch ex As Exception

        End Try
    End Sub

我的服务器连接很好,但我的代码的唯一问题是我无法更新 DataGridView1 中的项目并给出错误

System.InvalidOperationException: '连接已经打开。'

错误发生在con.Open()中

【问题讨论】:

  • 问题似乎很明显:您在连接对象上调用Open 并且收到一条错误消息,告诉您连接已经打开。那里的奥秘在哪里?您应该完全摆脱类级别的连接和命令变量。只需在您使用它们的地方创建它们并将它们分配给局部变量。使用Using 语句创建它们,并保证在块结束时关闭连接。

标签: mysql vb.net xampp


【解决方案1】:

我已将您的数据访问代码与您的用户界面代码分开。当 UI 发生变化或数据库发生变化时,这使得代码更易于维护。

为您的控件提供更具描述性的名称。几个月后,当您返回此代码时,您会记得TextBox4 中应该包含的内容吗?如果它被命名为txtLastName,您的代码将是自我记录的。

应在使用它们的方法中声明数据库对象,以便它们可以正确关闭和处置。 Using...End Using 块为我们处理这个问题。

您在更新语句中缺少 SET 关键字。

您可以将.CommandText 和.Connection 直接传递给Command 的构造函数。

在Execute.. 之前不要打开连接。

不要写空的Catch 块!他们只会吞下错误。您的代码误入歧途,但您不知情。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'Input validation
    Dim id As Integer
    If Not Integer.TryParse(TextBox1.Text, id) Then
        MessageBox.Show("Please enter a valid ID")
        Return
    End If
    'You may want to add additional validation to check if all the text boxes have data.
    Try
        UpdateProfile(id, TextBox2.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text)
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Update Profile Error")
    End Try
    Try
        Load()
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error Loading Grid")
    End Try
End Sub

Private Sub UpdateProfile(ID As Integer, fName As String, mName As String, lName As String, pos As String)
    Dim sql = "update profile SET FirstName=@fName, MiddleName=@mName, LastName=@lName, Position=@pos where EmployeeID=@empID"
    Using con As New MySqlConnection(str),
            cmd As New MySqlCommand(sql, con)
        cmd.Parameters.AddWithValue("@empID", ID)
        cmd.Parameters.AddWithValue("@fName", fName)
        cmd.Parameters.AddWithValue("@mName", mName)
        cmd.Parameters.AddWithValue("@lName", lName)
        cmd.Parameters.AddWithValue("@pos", pos)
        con.Open()
        cmd.ExecuteNonQuery()
    End Using 'Closes and disposes con and cmd
End Sub

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2019-05-10
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多