VB.NET SQLite查询中的StackOverflow
我的一个DB函数中有一个StackOverflowException,我不知道如何处理它。我有一个SQLite数据库,其中有一个表“tblEmployees”,它保存每个员工的记录(几千篇文章),通常这个函数运行起来没有任何问题 但有时在调用函数一千次后,它会在“ReturnTable.Load(reader)”行中出现StackOverflowException,并显示以下消息:System.Data.SQLite.dll中出现“System.StackOverflowException”类型的未处理异常 如果我重新启动应用程序,它就可以继续使用上次崩溃的帖子。我还可以在崩溃时从SQLite管理员发出完全相同的DB调用,而不会出现任何问题 代码如下:VB.NET SQLite查询中的StackOverflow,vb.net,sqlite,stack-overflow,Vb.net,Sqlite,Stack Overflow,我的一个DB函数中有一个StackOverflowException,我不知道如何处理它。我有一个SQLite数据库,其中有一个表“tblEmployees”,它保存每个员工的记录(几千篇文章),通常这个函数运行起来没有任何问题 但有时在调用函数一千次后,它会在“ReturnTable.Load(reader)”行中出现StackOverflowException,并显示以下消息:System.Data.SQLite.dll中出现“System.StackOverflowException”类型
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类对象时打开,在主窗体上关闭
我是否应该在finally块中每次都处理mycommand对象?但是这不会导致关闭的DB连接吗?如果没有堆栈跟踪,很难确定,但是我可以想象,在某个地方,对函数的递归调用会在每次迭代中增加调用堆栈的大小。
StackOverflowException
错误来自SQLite库,但我怀疑此时堆栈上的大多数调用都是您自己的函数。对SQLite库的调用是一个让骆驼崩溃的调用,但这并不一定是错误所在
发布堆栈跟踪(有趣的部分),也许我们可以更准确地告诉您错误在哪里。您能发布得到的堆栈跟踪吗?我可以想象它会很长,有很多几乎相同的线条。所以,把开始、结束和足够多的中间部分都贴出来,这样我们就可以算出重复的模式。作为一个提示。使用块封装命令和DataReader,这将负责处理对象。另外,作为说明,您可以将命令声明为类中的私有变量,这样就不需要每次都实例化它,调用ExexcuteScalar()可能更快/更好。另一方面,StackOverFlow异常与未处理的对象无关,这意味着函数是在无休止的循环中调用的。检查此函数是否不是从事件调用的,这样它会自动触发。谢谢各位,问题是递归调用,ExexcuteScalar()也快得多。竖起大拇指:)