我有一个按钮可以保存一些Textboxes&使用多种方法将Datagridview内容添加到数据库中,因此整个过程需要很长时间并且UI冻结了几秒钟,我该如何避免?也许使用多线程,我已经完成了我的研究,但我仍然无法弄明白。以下是我更好地了解我的代码:
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 Case中使用的方法之一的示例:
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,则Case One执行,如果为1,则Case 2执行..但Case 2执行Case One方法+其他方法,因此它变得均匀更重要的是保存数据。
我只想在BtnSave附近显示一个CircularProgressBar,同时保持UI响应并等待保存整个数据。
提前谢谢你,如果有点不清楚,我很抱歉,我尽量让它变得清晰。
答案 0 :(得分:0)
首先要弄清楚为什么需要很长时间。你在做很多更新吗?每个更新都需要很长时间吗?
使用MySQL EXPLAIN命令查看您的查询实际上在做什么。可能通过添加新索引或重构查询来修复效率低下的问题。检查不必要的JOIN或其他不必要的工作。
例如,在您的帖子中,您有查询:
select max(id_sau) from sau
为什么不呢:
n
为什么找到最大值...然后搜索表格以查找您已经找到的值?
如果您对数据库进行了多次单独调用,则可以通过将它们组合到一个调用中来提高性能。将多个SQL语句放在一个调用中,或者编写一个sproc。
如果您有许多相同记录的插入,您可以通过制作一个放入许多记录的大插入来提高性能,而不是多次执行相同的插入。 (这方面存在许多技术问题,因此取决于您插入的记录数量。)