Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 保存到数据库,同时保持用户界面响应VB.NET_Mysql_Vb.net_Multithreading_Methods_Freeze - Fatal编程技术网

Mysql 保存到数据库,同时保持用户界面响应VB.NET

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

我有一个按钮,可以使用多种方法将一些文本框和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案例中使用的方法之一的示例:

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)