在保持UI响应VB.NET的同时保存到数据库

时间:2015-05-08 16:52:34

标签: mysql vb.net multithreading methods freeze

我有一个按钮可以保存一些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响应并等待保存整个数据。

提前谢谢你,如果有点不清楚,我很抱歉,我尽量让它变得清晰。

1 个答案:

答案 0 :(得分:0)

首先要弄清楚为什么需要很长时间。你在做很多更新吗?每个更新都需要很长时间吗?

使用MySQL EXPLAIN命令查看您的查询实际上在做什么。可能通过添加新索引或重构查询来修复效率低下的问题。检查不必要的JOIN或其他不必要的工作。

例如,在您的帖子中,您有查询:

select max(id_sau) from sau

为什么不呢:

n

为什么找到最大值...然后搜索表格以查找您已经找到的值?

如果您对数据库进行了多次单独调用,则可以通过将它们组合到一个调用中来提高性能。将多个SQL语句放在一个调用中,或者编写一个sproc。

如果您有许多相同记录的插入,您可以通过制作一个放入许多记录的大插入来提高性能,而不是多次执行相同的插入。 (这方面存在许多技术问题,因此取决于您插入的记录数量。)