vb.net - 命令执行期间遇到致命错误。
问题描述
我想将 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
解决方案
首先,在整个应用程序中重复使用相同的连接对象是不好的。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
推荐阅读
- google-cloud-platform - GCP 服务和 GCP 资源有什么不同?
- excel - 按日期范围累计汇总同类群组行为,在 Excel 中没有偏移
- python-3.x - 防止 shlex 用冒号 (:) 拆分
- c++ - 在受污染的二叉树中查找元素
- fortran - 为什么在未定义的变量处出现运行时错误参考?
- c++ - C ++计算标准输入中的单词数
- text - Geany 编辑器弄乱了特殊字符
- css - 在 PWA 中滚动时在状态栏中显示的内容
- android - Android mvvm 我应该在两个视图中使用 2 个 ViewModel、1 个 ViewModel,还是在父活动中使用 1 个?
- powershell - 如何搜索特定文件名,然后使用 PowerShell 将该文件之后的所有文件移动到另一个文件夹