对于名为ALLconn的数组中的每个连接,我想将它与我的sql表进行比较。如果存在,则添加到我的列表视图。以下是我的代码,但它似乎不起作用:
Dim LoginFilter As Object
Dim SelCurrAllSessions As SqlClient.SqlCommand = New SqlClient.SqlCommand("Select * from CurrAllSessions", LFcnn)
SelCurrAllSessions.CommandType = CommandType.Text
LoginFilter = SelCurrAllSessions.ExecuteReader
For Each conn In AllConn
While LoginFilter.Read()
If conn.UserName.ToString() = LoginFilter.Item(0) Then
ListBox1.Items.Add(LoginFilter.Item(0))
End If
End While
Next
答案 0 :(得分:1)
你需要改变循环的顺序
While LoginFilter.Read()
For Each conn In AllConn
If conn.UserName.ToString() = LoginFilter.Item(0).ToString Then
ListBox1.Items.Add(LoginFilter.Item(0).ToString)
Exit For
End If
Next
End While
这是必要的,因为在您的原始代码中,内部运行直到从数据库加载的数据结束然后,当您尝试检查下一个conn时,您无法在加载数据的开头重新定位读取器数据库。
答案 1 :(得分:0)
反过来说,使用Contains
检查字符串是否包含在集合中,然后您可以将其添加到ListBox
:
Using LoginFilter = SelCurrAllSessions.ExecuteReader()
While LoginFilter.Read()
Dim connection = LoginFilter.GetString(0)
If AllConn.Contains(connection) Then
ListBox1.Items.Add(connection)
End If
End While
End Using
答案 2 :(得分:-1)
实际上,您的问题尚未完成,但仍然按照我的理解您尝试读取SqlCommand.ExecuteReader()的结果。当您阅读该结果时,它将从头到尾阅读,这只是您可以阅读的一次。如果你再次尝试阅读,它将显示一个错误,因为没有更多的内容可以从一个对象Loginfilter中读取。
所以,您可以将该读数存储到数组中并继续使用Foreach和使用新创建的数组的逻辑,或者您可以从LoginFilter读取并比较AllConn数组或List中的forech连接。
如果您需要更多解释,请随时回复我,我会寄给您C#版本。