Mysql 保存到数据库,同时保持用户界面响应VB.NET
我有一个按钮,可以使用多种方法将一些文本框和Datagridview内容保存到数据库中,因此整个过程需要很长时间,UI冻结了很多秒,我如何避免这种情况?也许使用多线程,我已经完成了我的研究,但我仍然无法理解。以下是我的代码,以便更好地理解我:Mysql 保存到数据库,同时保持用户界面响应VB.NET,mysql,vb.net,multithreading,methods,freeze,Mysql,Vb.net,Multithreading,Methods,Freeze,我有一个按钮,可以使用多种方法将一些文本框和Datagridview内容保存到数据库中,因此整个过程需要很长时间,UI冻结了很多秒,我如何避免这种情况?也许使用多线程,我已经完成了我的研究,但我仍然无法理解。以下是我的代码,以便更好地理解我: Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click Dim NbrP As Integer = CInt(combobox1.Selected
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Dim NbrP As Integer = CInt(combobox1.SelectedIndex)
Select Case NBR
Case 0
Try
SubmitA(...)
SubmitB(...)
MessageBox.Show("Data Inserted")
Catch ex As Exception
MessageBox.Show("Error :" & ex.ToString())
End Try
Case 1
Try
SubmitA(...)
SubmitB(...)
SubmitC(...)
SubmitD(...)
MessageBox.Show("Data Inserted")
Catch ex As Exception
MessageBox.Show("Error :" & ex.ToString())
End Try
..
..
End Select
End Sub
这是Select案例中使用的方法之一的示例:
Public Sub SubmitA(ByVal txtSupT As TextBox, ByVal cmbIntP As ComboBox, ByVal lblRecupIdF As Label)
Dim cmdSau = New MySqlCommand("INSERT INTO sau (sup_totale, nbr_parcelles, ferme_id_ferme) VALUES (@suptot, @nbrparcelles, @fermeid)", db_con)
Dim cmdRecupIdSau = New MySqlCommand("SELECT id_sau FROM sau WHERE id_sau = ( SELECT MAX(id_sau) FROM sau)", db_con)
Dim drRecSAU As MySqlDataReader
cmdSau.Parameters.AddWithValue("@suptot", CDbl(txtSupT.Text))
cmdSau.Parameters.AddWithValue("@nbrparcelles", CInt(cmbIntP.Text))
cmdSau.Parameters.AddWithValue("@fermeid", CInt(lblRecupIdF.Text))
cmdSau.ExecuteNonQuery()
drRecSAU = cmdRecupIdSau.ExecuteReader()
While drRecSAU.Read
recupIdSAU = CInt(drRecSAU(0))
End While
drRecSAU.Close()
End Sub
如您所见,如果combobox1值为0,则执行案例1,如果为1,则执行案例2。。但是case2执行case1方法+其他方法,因此保存数据变得更加繁重
我只想在BtnSave附近显示一个CircularProgressBar,同时保持UI的响应性并等待保存整个数据
提前谢谢你,如果有点不清楚,我很抱歉,我试着把它说得尽可能清楚。先弄清楚为什么要花很长时间。你在做很多更新吗?每次更新都需要很长时间吗 使用MySQL EXPLAIN命令查看您的查询真正在做什么。可能存在效率低下的问题,可以通过添加新索引或重新构造查询来解决。检查是否存在不必要的连接或其他不必要的工作 例如,在您的帖子中,您有以下查询:
SELECT id_sau FROM sau WHERE id_sau = ( SELECT MAX(id_sau) FROM sau)", db_con)
为什么不只是:
select max(id_sau) from sau
?
为什么要找到最大值。。。然后在表中搜索已找到的值
如果对数据库有多个单独的调用,则可以通过将它们组合到一个调用中来提高性能。在一次调用中放入多个SQL语句,或编写存储过程
如果同一条记录有多个插入,您可能可以通过制作一个大的插入以放入多条记录来提高性能,而不是多次执行同一个插入。(这方面有很多技术问题,因此这将取决于您插入的记录数量。)据我所知,如果没有线程,您真的无法做到这一点。我发现最简单的方法就是使用BackgroundWorker。在您的情况下,我将保存(到数组或某种集合)要插入的数据,然后将其传递给后台工作程序。您甚至可以使用BackgroundWorker的进度报告功能在流程执行时更新UI。我建议您使用存储过程。使用MAX获取唯一ID并不保证您将收到上次插入的ID。请看最后一个\u INSERT\u ID(只要它在同一事务中),SP将限制您进行的查询数量。@the\u lotus,捕捉得很好,但现在您提请我注意它…该查询的意义是什么。即使忽略存在
last\u insert\u id()
,该查询也可以是SELECT MAX(id\u sau)FROM sau
。它不必是我能看到的位置中的子查询。@uuerdo我太快地刷新了该查询。你是对的,where子句在这种情况下是无用的。谢谢你们的帮助,你们的回答真的很有帮助,我很感激!我仍然想知道,如果我以后遇到某种冻结,是否有可能在操作过程中使UI响应。(在解决您提到的问题后,无需更改太多我的代码并将数据保存到数组或集合..使用BGworker)