Как выбрать данные из локальной базы данных, когда их нет в удаленной базе данных - PullRequest
0 голосов
/ 05 мая 2019

Можно ли выбрать строки данных из локальной базы данных, если эти строки отсутствуют в удаленной базе данных? Я написал код, но он не работает: conlocal - это подключение к локальной базе данных, а conremote - это подключение к удаленной базе данных; Dim команда как

sqlcommand =  new sqlcommand ("select id from table", conlocal, "where id not in table",conremote)

1 Ответ

0 голосов
/ 06 мая 2019

комментариев в строке

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)
...