Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET SQLite查询中的StackOverflow_Vb.net_Sqlite_Stack Overflow - Fatal编程技术网

VB.NET SQLite查询中的StackOverflow

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”类型

我的一个DB函数中有一个StackOverflowException,我不知道如何处理它。我有一个SQLite数据库,其中有一个表“tblEmployees”,它保存每个员工的记录(几千篇文章),通常这个函数运行起来没有任何问题

但有时在调用函数一千次后,它会在“ReturnTable.Load(reader)”行中出现StackOverflowException,并显示以下消息:System.Data.SQLite.dll中出现“System.StackOverflowException”类型的未处理异常

如果我重新启动应用程序,它就可以继续使用上次崩溃的帖子。我还可以在崩溃时从SQLite管理员发出完全相同的DB调用,而不会出现任何问题

代码如下:

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()也快得多。竖起大拇指:)