2013-05-13 2 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

Каков тип массива? каковы столбцы в таблице? что представляет собой «матч»? –

ответ

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 

Это необходимо потому, что в исходном коде, внутренний, пока он работает до конца данных, загружаемых из базы данных, тогда, когда вы пытаетесь проверить следующее соединение, вы не можете переместить читателя в начале данных, загружаемых базой данных.

+0

Спасибо Стив. Ваше решение сработало. –

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 и сравнивать с соединениями forech в массиве AllConn или в List.

Пожалуйста, не стесняйтесь отвечать мне, если вам нужно больше объяснений, я пошлю вас на версию C#.

Смежные вопросы