2015-08-28 2 views
0

Я используюVB.NET MySQL иногда, но не всегда замораживание всего приложения

  • vb.NET 2013
  • Framework 2.0
  • ODBC соединение с .Net Framework
  • ODBC MySQL Connector 3,51

Иногда, но не всегда, когда я запрашиваю базу данных, программа перестает отвечать, и ошибки вообще нет.

После перезапуска приложения и повторного запуска точно так же, все работает так, как должно.

 Function GetData(ByVal xxx1 As Integer, ByVal xxx2 As DateTime, ByVal xxx3 As DateTime) As DataTable 
     Dim dt As DataTable = NewDT.GetData 

     Try 
      SyncLock Master_Con 
       Using cmd As New OdbcCommand(myCmdStr, Master_Con) 
        cmd.CommandTimeout = SQLCmd.intCmdTimeout '3 
        cmd.Parameters.Add("xxx1", OdbcType.Int).Value = xxx1 
        cmd.Parameters.Add("xxx2", OdbcType.NVarChar).Value = xxx2 
        cmd.Parameters.Add("xxx3", OdbcType.NVarChar).Value = xxx3 
        Using dr As OdbcDataReader = cmd.ExecuteReader 
         If dr.HasRows Then 
          Dim rowcount As Integer = 0 
          While dr.Read() 
           dt.Rows.Add() 
           For count As Integer = 0 To (dr.FieldCount - 1) 
            dt.Rows(rowcount).Item(count) = dr(count) 
           Next 
           rowcount = rowcount + 1 
          End While 
         End If 
        End Using 
       End Using 
      End SyncLock 

     Catch OdbcEx As OdbcException 
      MessageBox.Show("ODBC-Fehler bei Funktion 'GetData'. " & vbCrLf & vbCrLf & OdbcEx.Message, "App", MessageBoxButtons.OK, MessageBoxIcon.Error) 

     Catch ex As Exception 
      MessageBox.Show("Systemfehler bei Funktion 'GetData'. " & vbCrLf & vbCrLf & ex.Message, "App", MessageBoxButtons.OK, MessageBoxIcon.Error) 

     End Try 

     Debug.WriteLine("done.") 
     Return dt 

    End Function 

Мой журнал говорит что-то вроде этого:

GetData (28.08.15 - 28.08.15)... done. 
GetData2 (28.08.15)... done. 
DelData... done. 
GetData (28.08.15 - 28.08.15)... done. 
GetData2 (28.08.15)... done. 
GetData (27.08.15 - 27.08.15)... done. 
GetData2 (27.08.15)... done. 
GetData (26.08.15 - 26.08.15)... 

Программа просто продолжает не отвечать во время работы cmd.ExecuteReader. Поскольку я запускаю команду точно так же, как много раз, я предполагал, что она имеет какое-то отношение к таймауту или серверу mysql/соединение занято.

Но так как он никогда не вызывает ошибку/odbc, и это происходит только каждый раз, а затем я не знаю, как его решить.

Любая помощь будет приятной!

+0

Наиболее вероятной причиной для заморозки приложения является то, что поток графического интерфейса занят, и внешний вид формы не может быть обновлен. В вашем случае, я думаю, что несколько раз данные извлекаются быстрее, чтобы вы заметили замораживание. Наилучшее решение в этих случаях опирается на многопоточность (т. Е. Выполнение деталей слишком долго в другом потоке); BackgroundWorker весьма удобен для подобных ситуаций. Здесь у вас есть несколько простых примеров, показывающих, как их реализовать: http://www.dotnetperls.com/backgroundworker-vbnet – varocarbas

+0

С другой стороны, невозможно понять, почему в некоторых случаях ваше соединение происходит медленнее (или даже полностью застряло). Вы должны тщательно анализировать свои специфические условия; и, в конце концов, опубликуйте вопрос, четко описывающий их (не в этом случае), чтобы кто-то мог что-то предложить. – varocarbas

+0

Я просил информацию о том, что искать или анализировать. -> Поместить его в собственный поток, возможно, но разве это не обходное решение? Возможно, поток тоже замерзнет. Тогда я должен сделать собственный тайм-аут и убить его. Если это единственное решение ...:/ – Duashdae

ответ

0

Проблема заключалась в том, чтобы иногда возникать тупик.

Теперь он работает так, как следует после вызова выполнения SQLCommand в своей собственной функции.

Private Delegate Function ExecScalarDelegate(ByVal cmd As System.Data.Odbc.OdbcCommand, _ 
ByRef ReturnValue As Object) As Boolean 

Private Shared Function ExecScalar(ByVal cmd As System.Data.Odbc.OdbcCommand, _ 
ByRef ReturnValue As Object) As Boolean 
    ExecScalar = False 

    SyncLock cmd.Connection 
     ReturnValue = cmd.ExecuteScalar() 
    End SyncLock 
    Return True 
End Function