繁体   English   中英

比较数组与SQl表

[英]Compare array with SQl table

对于名为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

好了,您需要更改循环的顺序

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

与此相反,使用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

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

因此,您可以将该读数存储到数组中,然后继续使用Foreach和新创建的数组进行逻辑处理,或者可以从LoginFilter中读取并比较到AllConn数组或List中的Forech连接。

如果您需要更多说明,请随时回复我,我将以C#版本发送给您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM