我正在尝试将SQL查询的结果读入List(Of),我可以在向List增量添加项目的同时看到List.count,但是当我尝试阅读时,我的代码的另一部分列出List.Count返回0。
我的清单如下:
Public Class roomList
Public Sub New()
End Sub
Public Property eName() As String
Get
Return _eName
End Get
Set(ByVal value As String)
_eName = value
End Set
End Property
Public Property eID() As Integer
Get
Return _eID
End Get
Set(ByVal value As Integer)
_eID = value
End Set
End Property
Public Property eEmail() As String
Get
Return _eEmail
End Get
Set(ByVal value As String)
_eEmail = value
End Set
End Property
Private _eID As Integer
Private _eName As String
Private _eEmail As String
End Class
我正在将SQL结果读入列表,如下所示: 编辑:这段代码在它自己的Sub()。
Dim rooms As New List(Of roomList)
While dr.Read
rooms.Add(New roomList() With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})
MsgBox(rooms.Count)
End While
然后我尝试按如下方式读取List的计数: 编辑:这段代码在它自己的Sub()。
Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)
任何人都可以帮我理解为什么List返回0,并帮助我修复代码以便正确调用列表?
我感谢任何人能提供的帮助,如果您需要任何进一步的信息,请随时与我联系。
马特
编辑:我试图读取/写入List的两段代码都在它们自己的Sub中,我是否应该声明一个全局变量?
第一个Sub如下:
Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Try
getRoomList()
Dim rooms As New List(Of roomList)()
Dim r As roomList
MsgBox(rooms.Count)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
调用getRoomList()子:
Private Sub getRoomList()
Dim rooms As New List(Of roomList)
Try
' SQL Query stuff goes here
dr = sqlCmd.ExecuteReader
While dr.Read
rooms.Add(New roomList() With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})
'MsgBox(rooms.Count)
End While
End If
Catch ex As Exception
End Try
End Sub
答案 0 :(得分:3)
这有效:
Dim rooms As New List(Of roomList)
While dr.Read
rooms.Add(New roomList() With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})
MsgBox(rooms.Count)
End While
MsgBox(rooms.Count)
消除新房间的建立:
Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)
上面创建了一个新的列表对象,实际上它最初是空的。
你提到了
编辑:我试图读/写的两段代码 列表是在他们自己的Sub中,我是否应该声明一个 全局变量?
因为它们位于2个不同的子例程中,所以一个实例丢失,因此计数现在为0,因为您已经创建了一个新实例。您要做的是获取初始列表并将其传递给相关的子例程/函数。如果您打算修改该列表,请将其传递给ByRef
,否则将其传递给ByVal
。有这样的效果:
'code...
PrintListCount(rooms)
'other code...
protected Sub PrintListCount(ByVal rooms as List(Of roomList))
MsgBox(rooms.Count)
end sub
这个例子有点可怕,因为你真的不需要按值传递整个列表来打印列表的数量。但我只是用它来向你展示如何通过列表室。
您的getRoomList()
函数未返回列表。如果没有返回适当的对象,您如何期望收集计数?将sub更改为函数:
Private Function getRoomList() As List(Of roomList)
Dim rooms As New List(Of roomList)
Try ' SQL Query stuff goes here
dr = sqlCmd.ExecuteReader
While dr.Read
rooms.Add(New roomList()
With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})
'MsgBox(rooms.Count)
End While
End If
Catch ex As Exception
End Try
return rooms
End Function
在你的加载事件中:
Dim rooms as List(Of roomList)
rooms = getRoomList();
现在你有了一个合适的房间对象,你现在可以说:
MsgBox(rooms.Count)
您需要阅读有关传递对象,函数如何工作以及变量范围的信息。没有这些知识,你就会对自己造成更大的困难。
答案 1 :(得分:0)
这个片段:
Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)
确实总会显示0,因为您正在创建一个新列表并声明一个名为rooms
的单独变量。
您尚未显示您在哪里调用 读取数据的代码(即上一个代码段)。
说实话,目前还不清楚所有这些代码的执行位置。如果您可以提供简短但完整的程序来演示问题,那将会有很大帮助。当我们只能看到片段时,很难很好地理解整个程序流程。
答案 2 :(得分:0)
从第二个代码段开始,是什么让您认为您使用的是同一个列表?您在新的Dim'd变量上创建了New
List(Of roomList)实例。要修复此代码,我们需要知道这两个代码段是如何相关的。
答案 3 :(得分:0)
一些可能性:
如果您在代码中声明两次房间列表,则第二个声明将创建一个新的计数0房间列表,并基本上擦除前一个列表。根据您发布的内容,可能会发生的事情。
如果数据源中没有房间,读者可能会返回0个房间。
房间变量的范围错误。 n将其范围增加到模块,类或更高级别,以便两个子访问同一个变量,而不是两个不同的变量。
另外,我会将计数移出循环。最后算一下吧。