StackOverflow в запросе VB.NET SQLite - PullRequest
3 голосов
/ 02 апреля 2010

У меня есть 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-соединению?

1 Ответ

1 голос
/ 02 апреля 2010

Трудно быть уверенным без трассировки стека, но я думаю, что где-то у вас есть рекурсивный вызов функции, которая увеличивает размер стека вызовов на каждой итерации. Ошибка StackOverflowException исходит из библиотеки SQLite, но я подозреваю, что большинство вызовов стека на данный момент являются вашими собственными функциями. Вызов в библиотеку SQLite был вызовом, который сломал спину верблюда, но это не обязательно, где ошибка.

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

...