2013-05-13 133 views
0

对于名为ALLconn的数组中的每个连接,我想将它与我的sql表进行比较。如果存在,然后添加到我的列表视图。这里是我的代码如下,但它似乎并没有工作:比较阵列与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 
+1

数组的类型是什么?表中的列是什么?什么构成“匹配”? – 2013-05-13 21:07:43

回答

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时,无法在数据库加载的数据开始时重新定位阅读器。

+0

谢谢史蒂夫。您的解决方案奏效 – 2013-05-13 21:19:52

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 
-1

其实,你的问题是未完成的,但仍然按我理解你试图读取SqlCommand.ExecuteReader()的结果。当你读到这个结果时,它会从头到尾阅读,这是你只能阅读的一次。如果您尝试再次阅读,则会显示错误,因为没有更多内容要从对象Loginfilter中读取。

因此,您可以将该读数存储到数组中,并继续使用您的Foreach,而使用新创建的数组的逻辑或者您可以从LoginFilter读取数据,并将其与AllConn数组或List中的forech连接进行比较。

如果你需要更多的解释,请随时响应我,我会送你在C#版本。