комментариев в строке
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'Get ID's from remote database
Dim RemoteDT As New DataTable
Using cn As New SqlConnection("Your remote connection string")
Using cmd As New SqlCommand("Select Id From [RemoteTableName];", cn)
cn.Open()
RemoteDT.Load(cmd.ExecuteReader)
End Using
End Using
'Put the Ids into an array
Dim IdsInRemote As Integer() = (RemoteDT.AsEnumerable().[Select](Function(x) x.Field(Of Integer)("Id"))).ToArray()
'Change the array to a single string that can be used in the Select statement
Dim Remotes As String = String.Join(",", IdsInRemote)
Dim LocalDT As New DataTable
Using cn As New SqlConnection("Your local connection string")
Using cmd As New SqlCommand($"Select Id From [LocalTableName] Where Id Not In ({Remotes});", cn)
cn.Open()
LocalDT.Load(cmd.ExecuteReader)
End Using
End Using
For Each row As DataRow In LocalDT.Rows
Debug.Print(row(0).ToString)
Next
End Sub
EDIT
Для версий vb.net до 14 (2015)
Using cmd As New SqlCommand(String.Format("Select Id From [LocalTableName] Where Id Not In ({0});", Remotes), cn)
EDIT
Объяснение RemoteDT.AsEnumerable().[Select](Function(x) x.Field(Of Integer)("Id")).ToArray()
.AsEnumerable - это метод DataTable, который возвращает перечисляемый тип DataRow.
При выборе будет выбираться строки из перечисляемого, которые соответствуют критериям, которые мы предоставляем. В этом случае мы предоставляем функцию с параметром x.
x относится к элементам IEnumerable, в данном случае DataRow. Вы можете назвать это как угодно. Переменная будет видна только внутри этой встроенной функции, поэтому простое имя в порядке. Описательное имя тоже подойдет, но так как оно видно внутри строки, оно действительно не обязательно.
Таким образом, функция проверяет каждый x в перечисляемом (каждый DataRow) и возвращает только значения в поле целых чисел с именем «Id»
Моя ошибка здесь!
Наконец, перечислимый преобразуется в массив. Я забыл добавить круглые скобки вокруг перечислимого, который должен быть преобразован в массив.
(RemoteDT.AsEnumerable().[Select](Function(x) x.Field(Of Integer)("Id"))).ToArray()
EDIT
Поскольку теперь я узнал, что Id - это строка
'Put the Ids into an array
'Change the datatype of the array and the field to String
Dim IdsInRemote As String() = (RemoteDT.AsEnumerable().[Select](Function(x) x.Field(Of String)("Id"))).ToArray()
'Change the array to a single string that can be used in the Select statement
'Add single quotes to the .Join so Sql Server will interpret as String
Dim Remotes As String = String.Join("','", IdsInRemote)
'Put a single quote on the beginning and end of the Remotes string
'The Join does not do this
Remotes = "'" & Remotes & "'"
'You can inspect the string in the immediate window
Debug.Print(Remotes)