首页 > 解决方案 > 命令执行期间遇到致命错误。

问题描述

我想将 datagridview 的行保存到数据库中。我正在使用editbtn单击按钮,当我按下按钮时,它给了我以下错误:“在命令执行期间遇到致命错误。” 这是我正在使用的代码

Private Sub Supplier_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        conn.ConnectionString = "Server=127.0.0.1;Database=pembelian;Uid=root;Pwd=;"
        If conn.State = ConnectionState.Open Then
            conn.Close()
        End If
        conn.Open()
        disp_data()
    End Sub
Public Sub disp_data()
        cmd = conn.CreateCommand()
        cmd.CommandType = CommandType.Text
        cmd.CommandText = "select * from supplier"
        cmd.ExecuteNonQuery()
        Dim dt As New DataTable()
        Dim da As New MySqlDataAdapter(cmd)
        da.Fill(dt)
        DataGridView1.DataSource = dt
    End Sub
 
Private Sub edit_btn_Click(sender As Object, e As EventArgs) Handles edit_btn.Click
        Dim query As String = "updates supplier set nama=@nama, alamat=@alamat where npwp=@npwp"
        cmd = New MySqlCommand(query, conn)
        cmd.Parameters.AddWithValue("@nama", nama.Text)
        cmd.Parameters.AddWithValue("@alamat", alamat.Text)
        cmd.ExecuteNonQuery()
        MessageBox.Show("Data berhasil di update")
        disp_data()
    End Sub



 

标签: vb.net

解决方案


首先,在整个应用程序中重复使用相同的连接对象是不好的。ADO.Net 中有一个称为连接池的功能,您在代码中使用的MySqlConnection对象实际上是真正底层连接的简单包装器。这些真实的连接更重,管理起来也更昂贵。他们处理身份验证、获取网络套接字资源、与服务器协商等实际工作。

当您尝试重用同一个连接对象时,您是在优化小事物 ( MySqlConnection),而牺牲大事物(真正的底层连接)。不要那样做。

相反,您最好为大多数查询创建一个新连接,然后尽快将其返回到池中。这通常用Using块来处理。


顺便说一句,我可以看看实际的问题。我注意到@npwp参数没有在最后一个方法中定义。猜测适当字段的名称,您需要更多类似的内容:

Private Sub edit_btn_Click(sender As Object, e As EventArgs) Handles edit_btn.Click
    Dim query As String = "updates supplier set nama=@nama, alamat=@alamat where npwp=@npwp"
    Using conn As New MySqlConnection("Server=127.0.0.1;Database=pembelian;Uid=root;Pwd=;")
    Using cmd As New MySqlCommand(query, conn)

        cmd.Parameters.AddWithValue("@nama", nama.Text)
        cmd.Parameters.AddWithValue("@alamat", alamat.Text)
        cmd.Parameters.AddWithValue("@npwp", npwp.Text)

        conn.Open()
        cmd.ExecuteNonQuery()
    End Using
    End Using

    MessageBox.Show("Data berhasil di update")
    disp_data()
End Sub

Public Sub disp_data()
    Dim dt As New DataTable()

    Dim query As String = "select * from supplier"
    Using conn As New MySqlConnection("Server=127.0.0.1;Database=pembelian;Uid=root;Pwd=;")
    Using cmd As New MySqlCommand(query, conn)
    Using da As New MySqlDataAdapater(cmd)
        da.Fill(dt)
    End Using
    End Using
    End Using

    DataGridView1.DataSource = dt
End Sub

推荐阅读