所以我在VB.net项目中使用SQLite,该项目有一个填充的数据库。我使用的是Microsoft.Data.Sqlite.Core和System.Data.Sqlite NuGet包库。因此,当我试图获得查询结果时,问题就出现了。首先,SQLiteDataReader获取响应和所需表的所有元素。我知道这是因为在调试器中,我在设置对象后有一个断点,当我检查SQLiteDataReader对象的参数时,结果视图会显示我表的所有元素,但一旦我从对象中移除鼠标并再次检查,结果视图就会变为空,甚至没有继续下一行代码。有人知道这是一个已知的错误还是什么原因吗?我在另一个项目中使用了这种查询表的方法,它确实有效。
代码:
Public Function RunQuery(com As String)
If CheckConnection() Then
command.CommandText = com
Dim response As SQLiteDataReader
response = command.ExecuteReader
Dim len As Integer = response.StepCount
Dim col As Integer = response.FieldCount
Dim resp(len, col) As Object
For i = 0 To col - 1
Using response
response.Read()
For j = 0 To len - 1
resp(i, j) = response.GetValue(j)
Next
End Using
Next
具有已填充结果视图的调试器结果视图为空的调试器
edit:添加了for循环,以表明结果视图不仅在调试器上是空的。使用响应时。Read((会抛出一个异常";System.InvalidOperationException:"没有当前行">
正如我在评论中告诉您的那样,DataReader派生类是一个仅向前的检索对象。这意味着,当您到达查询返回的记录的末尾时,该对象无法从头开始重新启动。
因此,如果您强制调试器枚举视图,则读取器将到达结果的末尾,第二次尝试显示读取器的内容将失败。
你问题的另一部分是由于对如何处理读者的误解造成的。您应该在不使用StepCount属性的情况下循环读取结果。据我所知,这个属性不是标准的,其他数据提供程序也不支持它。它可能存在于SQLite提供程序中,因为对他们来说,计算记录数量相对容易,而其他提供程序出于性能原因不尝试计算该值。
然而,还有其他方式可以从读者那里阅读。其中之一是用Load方法填充DataTable对象,该方法可以方便地获取DataReader
Dim data As DataTable = New DataTable()
Using response
data.Load(response)
End Using
' Now you have a datatable filled with your data.
' No need to have a dedicated bidimensional array
DataTable就像一个数组,其中有行和列,而不是要迭代的索引。