2015-05-08 3 views
2

У меня есть кнопка, которая сохраняет некоторые текстовые поля & Содержимое 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, сохраняя при этом интерфейс пользователя и ожидая сохранения всех данных.

Благодарим вас заранее, извините, если это немного неясно, я попытался сделать его максимально ясным.

+1

Насколько я знаю, вы действительно не можете сделать это без потоковой передачи. Самый простой способ, который я нашел, - использовать BackgroundWorker. В вашем случае я бы сэкономил (на массив или какую-то коллекцию) данные, которые будут INSERTed, а затем передайте это фоновому работнику. Вы даже можете использовать функциональные возможности отчета BackgroundWorker для обновления пользовательского интерфейса при выполнении процесса. Https: //msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx – Uueerdo

+0

Мощь Я предлагаю процедуру хранения. Использование MAX для получения уникального идентификатора не гарантирует, что вы получите тот, который был получен из последней вставки. Посмотрите на LAST_INSERT_ID (пока он находится в одной транзакции), и SP ограничит количество запросов, которые вы делаете. –

+0

@the_lotus, приятно поймать, но теперь, когда вы обращаете мое внимание на это ... в чем смысл этого запроса. Даже игнорируя существование 'last_insert_id()', этот запрос может быть просто 'SELECT MAX (id_sau) FROM sau'. Нет необходимости, чтобы это был подзапрос в ГДЕ, который я вижу. – Uueerdo

ответ

0

Сначала выясните, почему это занимает много времени. Вы делаете много обновлений? У каждого отдельного обновления требуется много времени?

Используйте команду MySQL EXPLAIN, чтобы увидеть, что ваши запросы действительно делают. Может быть неэффективность, которая может быть исправлена ​​путем добавления новых индексов или реструктуризации запросов. Проверьте наличие ненужных JOIN или других ненужных работ.

Например, в вашем посте у вас есть запрос:

SELECT id_sau FROM sau WHERE id_sau = (SELECT MAX(id_sau) FROM sau)", db_con) 

Почему не просто:

select max(id_sau) from sau 

?

Зачем находить максимальное значение ... и затем искать в таблице, ища значение, которое вы уже нашли?

Если у вас есть много отдельных вызовов в базе данных, вы можете повысить производительность, объединив их в один вызов. Поместите несколько операторов SQL в один вызов или напишите sproc.

Если у вас много вставок одной и той же записи, вы, вероятно, можете улучшить производительность, сделав одну большую вставку, которая помещается во многие записи, вместо того, чтобы выполнять одну и ту же вставку много раз. (Есть много технических вопросов по этому вопросу, поэтому это будет зависеть от того, сколько записей вы вставляете.)

Смежные вопросы