Столбец не принадлежит таблице при вставке в SQL Server - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь переместить данные между двумя серверами.У меня есть идентичная таблица на каждом сервере с 3 полями: Customer_Code (varchar), Customer_EmailAddress (nvarchar), Customer_EmailAddressPosted (бит).

Dim DT_EmailsToUpdatePreCheck As New DataTable
Dim DT_EmailsToUpdateStage As New DataTable

На сервере 1 я выбираю все данные и сохраняю в DT_EmailsToUpdatePreCheck

 TabletCommand.CommandText = "Select * from SOP_MissingCustomerEmail"
 DT_EmailsToUpdatePreCheck.Load(TabletCommand.ExecuteReader)
 TabletCommand.Parameters.Clear()

Затем я перебираю DT_EmailsToUpdatePreCheck и получаю количество записей от Server2, где ни Customer_Code, ни Customer_EmailAddress не идентичны, и сохраняю данные в DT_EmailsToUpdateStage.

For j As Integer = 0 To DT_EmailsToUpdatePreCheck.Rows.Count - 1

            ServerCommand.CommandText = "Select Count(*) from SOP_MissingCustomerEmail where Customer_Code <> @Customer_Code and Customer_EmailAddress <> @Customer_EmailAddress"
            ServerCommand.Parameters.AddWithValue("@Customer_Code", DT_EmailsToUpdatePreCheck.Rows(j).Item("Customer_Code"))
            ServerCommand.Parameters.AddWithValue("@Customer_EmailAddress", DT_EmailsToUpdatePreCheck.Rows(j).Item("Customer_EmailAddress"))

            If ServerCommand.ExecuteScalar = 0 Then

                DT_EmailsToUpdateStage.ImportRow(DT_EmailsToUpdatePreCheck.Rows(j))
            End If

            ServerCommand.Parameters.Clear()
Next

Наконец, я выполняю итерацию DT_EmailsToUpdateStage для вставки записей в Server2

  For i As Integer = 0 To DT_EmailsToUpdateStage.Rows.Count - 1
            ServerCommand.CommandText = "Insert Into SOP_MissingCustomerEmail2 (Customer_Code, Customer_EmailAddress, Customer_EmailAddressPosted) Values (@Customer_Code, @Customer_EmailAddress, @Customer_EmailAddressPosted)"
            ServerCommand.Parameters.AddWithValue("@Customer_Code", DT_EmailsToUpdateStage.Rows(i).Item("Customer_Code").ToString())
            ServerCommand.Parameters.AddWithValue("@Customer_EmailAddress", DT_EmailsToUpdateStage.Rows(i).Item("Customer_EmailAddress").ToString())
            ServerCommand.Parameters.AddWithValue("@Customer_EmailAddressPosted", DT_EmailsToUpdateStage.Rows(i).Item("Customer_EmailAddressPosted").ToString())

            MessageBox.Show("Row Inserted")
            ServerCommand.Parameters.Clear()
  Next

Но при вставке я получаю сообщение об ошибке «Столбец Customer_Code» не принадлежит таблице ».Примечание. Последние два кодовых блока находятся внутри блока Try-Catch.

1 Ответ

0 голосов
/ 27 июня 2019

Хорошо, мне удалось решить это. DT_EmailsToUpdateStage не был заполнен должным образом. При создании Datatables мне пришлось диктовать структуру столбцов, чтобы при вызове элементов по имени столбца они были найдены.

    Dim DT_UpdateEmailStage1 As New DataTable
    DT_UpdateEmailStage1.Columns.Add("Customer_Code", Type.GetType("System.String"))
    DT_UpdateEmailStage1.Columns.Add("Customer_EmailAddress", Type.GetType("System.String"))
    DT_UpdateEmailStage1.Columns.Add("Customer_EmailAddressPosted", Type.GetType("System.String"))

    Dim DT_UpdateEmailStage2 As New DataTable
    DT_UpdateEmailStage2.Columns.Add("Customer_Code", Type.GetType("System.String"))
    DT_UpdateEmailStage2.Columns.Add("Customer_EmailAddress", Type.GetType("System.String"))
    DT_UpdateEmailStage2.Columns.Add("Customer_EmailAddressPosted", Type.GetType("System.String"))

Я также изменил способ добавления значений в строку. Сначала я поместил значения из таблицы в переменную, а затем передал их как параметры в Rows.Add (), чем при использовании ImportRow ()

            Dim code As String
            Dim email As String
            Dim posted As String

            code = DT_UpdateEmailStage1.Rows(j).Item(0)
            email = DT_UpdateEmailStage1.Rows(j).Item(1)
            posted = DT_UpdateEmailStage1.Rows(j).Item(2)

            If ServerCommand.ExecuteScalar = 0 Then
                DT_UpdateEmailStage2.Rows.Add(code, email, posted)
            End If

и аналогичный метод при входе на сервер2

            Dim code As String
            Dim email As String
            Dim posted As String

            code = DT_UpdateEmailStage2.Rows(i).Item(0)
            email = DT_UpdateEmailStage2.Rows(i).Item(1)
            posted = DT_UpdateEmailStage2.Rows(i).Item(2)


            ServerCommand.CommandText = "insert into SOP_MissingCustomerEmail(customer_code, customer_emailaddress, customer_emailaddressposted) values (@customer_code, @customer_Emailaddress, @customer_EmailaddressPosted)"
            ServerCommand.Parameters.AddWithValue("@customer_code", code)
            ServerCommand.Parameters.AddWithValue("@customer_emailaddress", email)
            ServerCommand.Parameters.AddWithValue("@customer_emailaddressposted", posted)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...