У меня есть StackOverflowException в одной из моих функций БД, с которой я не знаю, как справиться. У меня есть база данных SQLite с одной таблицей «tblEmployees», в которой хранятся записи для каждого сотрудника (несколько тысяч сообщений), и обычно эта функция выполняется без проблем.
Но иногда после того, как функция вызывается тысячу раз, она разрывается с StackOverflowException в строке «ReturnTable.Load (reader)» с сообщением: необработанное исключение типа «System.StackOverflowException» произошло в System.Data. SQLite.dll
Если я перезапущу приложение, у него не будет проблем с тем же постом, на котором он последний раз падал. Я также могу сделать точно такой же DB-вызов из SQLite Admin во время сбоя без проблем.
Вот код:
Public Function GetNextEmployeeInQueue() As String
Dim NextEmployeeInQueue As String = Nothing
Dim query As [String] = "SELECT FirstName FROM tblEmployees WHERE Checked=0 LIMIT 1;"
Try
Dim ReturnTable As New DataTable()
Dim mycommand As New SQLiteCommand(cnn)
mycommand.CommandText = query
Dim reader As SQLiteDataReader = mycommand.ExecuteReader()
ReturnTable.Load(reader)
reader.Close()
If ReturnTable.Rows.Count > 0 Then
NextEmployeeInQueue = ReturnTable.Rows(0)("FirstName").ToString()
Else
MsgBox("No more employees found in queue")
End If
Catch fail As Exception
MessageBox.Show("Error: " & fail.Message.ToString())
End Try
If NextEmployeeInQueue IsNot Nothing Then
Return NextEmployeeInQueue
Else
Return "No more records in queue"
End If
End Function
Когда происходит сбой, читатель имеет «Ошибка оценки свойства». во всех значениях.
Я предполагаю, что есть некоторая проблема с выделенной памятью, которая не освобождается правильно, но не может выяснить, о чем идет речь. DB-соединение открывается при создании объекта DB-класса и закрывается в главной форме Dispose.
Должен ли я избавляться от объекта mycommand каждый раз в блоке finally? Но не приведет ли это к закрытому DB-соединению?