У меня есть кнопка, которая сохраняет некоторые текстовые поля & Содержимое Datagridview для базы данных, используя множество методов, поэтому весь процесс занимает много времени, и пользовательский интерфейс замерзает в течение многих секунд, как можно Я избегаю этого? Возможно, используя многопоточность, я сделал свое исследование, но я все еще не могу понять. Вот мой код, чтобы лучше понять меня:Сохранение базы данных при сохранении пользовательского интерфейса VB.NET
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, Случай 1 получает исполнение, и если это 1, дело 2 выполняется. Но случай 2 выполняет методы Case One + другие методы, поэтому он становится еще тяжелее, чтобы сохранить данные.
Я просто хочу показать CircularProgressBar рядом с BtnSave, сохраняя при этом интерфейс пользователя и ожидая сохранения всех данных.
Благодарим вас заранее, извините, если это немного неясно, я попытался сделать его максимально ясным.
Насколько я знаю, вы действительно не можете сделать это без потоковой передачи. Самый простой способ, который я нашел, - использовать BackgroundWorker. В вашем случае я бы сэкономил (на массив или какую-то коллекцию) данные, которые будут INSERTed, а затем передайте это фоновому работнику. Вы даже можете использовать функциональные возможности отчета BackgroundWorker для обновления пользовательского интерфейса при выполнении процесса. Https: //msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx – Uueerdo
Мощь Я предлагаю процедуру хранения. Использование MAX для получения уникального идентификатора не гарантирует, что вы получите тот, который был получен из последней вставки. Посмотрите на LAST_INSERT_ID (пока он находится в одной транзакции), и SP ограничит количество запросов, которые вы делаете. –
@the_lotus, приятно поймать, но теперь, когда вы обращаете мое внимание на это ... в чем смысл этого запроса. Даже игнорируя существование 'last_insert_id()', этот запрос может быть просто 'SELECT MAX (id_sau) FROM sau'. Нет необходимости, чтобы это был подзапрос в ГДЕ, который я вижу. – Uueerdo