Использование нескольких SQL-запросов в одном операторе

0

Эй, ребята, у меня проблемы с моими руками,

Использование VB.Net; Я пытаюсь скопировать поле в одной записи в одной таблице в другое поле в другой записи в другой таблице, а также вставить новую запись, используя значения, которые пользователь будет вставлен в текстовые поля на одной из моих форм VB.

Используемые две таблицы называются "Персонал" и "Роль", и каждое их содержимое находится ниже:

Штат сотрудников:

Обновится позже!

Роль:

Обновится позже!

Когда пользователь ввел некоторые значения в мою форму и нажимает кнопку, запускается следующий код

Private Sub AddSMButton_Click(sender As Object, e As EventArgs) Handles AddSMButton.Click
    If DbConnect() Then
        Dim SQLCmd As New OleDbCommand
        If StaffID = -1 Then
            With SQLCmd
                .Connection = cn
                .CommandText = "Insert into Staff (StaffMemberFirstName, StaffMemberLastName, StaffMemberDOB, StaffMemberGender, StaffMemberContactNumber, StaffMemberEmail, StaffMemberPostcode, StaffMemberHomeAddress, StaffMemberHoursWorked, UnitID, RoleID) " &
                    "Select @StaffMemberFirstName, @StaffMemberLastName, @StaffMemberDOB, @StaffMemberGender, @StaffMemberContactNumber, @StaffMemberEmail, @StaffMemberPostcode, @StaffMemberHomeAddress, @StaffMemberHoursWorked, @UnitID, @RoleID"
                .Parameters.AddWithValue("@StaffMemberFirstName", AddSM_FNInput.Text)
                .Parameters.AddWithValue("@StaffMemberLastName", AddSM_LNInput.Text)
                .Parameters.AddWithValue("@StaffMemberDOB", AddDOB_DTP.Value.Date)
                .Parameters.AddWithValue("@StaffMemberGender", AddSM_GInput.Text)
                .Parameters.AddWithValue("@StaffMemberContactNumber", AddSM_CNInput.Text)
                .Parameters.AddWithValue("@StaffMemberEmail", AddSM_EInput.Text)
                .Parameters.AddWithValue("@StaffMemberPostcode", AddSM_PInput.Text)
                .Parameters.AddWithValue("@StaffMemberHomeAddress", AddSM_AInput.Text)
                .Parameters.AddWithValue("@StaffMemberHoursWorked", AddHW_TB.Text)
                .Parameters.AddWithValue("@UnitID", AddU_CB.SelectedItem.Identifier)
                .Parameters.AddWithValue("@RoleID", AddR_CB.SelectedItem.Identifier)
                .ExecuteNonQuery()
                .CommandText = "Select @@Identity"
                StaffID = .ExecuteScalar
                AddSalary(StaffID)
            End With
            MessageBox.Show("The new record has been inserted!")
            AddSM_FNInput.Text = ""
            AddSM_LNInput.Text = ""
            AddSM_GInput.Text = ""
            AddSM_CNInput.Text = ""
            AddSM_EInput.Text = ""
            AddSM_PInput.Text = ""
            AddSM_AInput.Text = ""
            AddHW_TB.Text = ""
        End If
        cn.Close()
        StaffID = -1
    End If
End Sub

Приведенный выше код может правильно добавить новую запись с указанными значениями.

Но он не добавляет зарплату к новой записи, и я не знаю почему?

Следующий код - это процедура AddSalary

Private Sub AddSalary(StaffID)
    If DbConnect() Then
        Dim SQLCmd As New OleDbCommand
        With SQLCmd
            .Connection = cn
            .CommandText = "Insert into Staff (StaffMemberWages) " &
                "Select Salary " &
                "From Role " &
                "Where Role.RoleID = @RoleID and Staff.StaffID = @StaffID"
            .Parameters.AddWithValue("@RoleID", AddR_CB.SelectedItem.Identifier)
            .Parameters.AddWithValue("@StaffID", StaffID)
        End With
    End If
End Sub

Есть несколько причин, почему я не думаю, что это работает, но я не уверен, что они верны.

Итак, чтобы подвести итог, я пытаюсь создать 1 оператор SQL, который позволит мне вставить новую запись в таблицу "Персонал", а также копировать в эту новую запись значение из таблицы "Роль".

Любая помощь будет принята с благодарностью,

Спасибо, что прочитали и хорошо провели день!

  • 0
    Вы должны использовать Using особенно с этими соединениями. Кроме того, это действительно вопрос «помощи при отладке». AddSalary работает успешно? Любые ошибки или предупреждения? Отладка с локальными пользователями и копирование полного сгенерированного SQL-запроса и его запуск в базе данных. Вставляет ли он запись?
  • 0
    Сначала вы создаете новую запись персонала, затем в процедуре AddSalary вы хотите создать ее снова (оба оператора sql используют оператор вставки, а оператор вставки не имеет предложения where). AddSalary должен использовать обновление. Более того, получайте информацию о зарплате либо с помощью отдельного выбора, либо преобразуйте основную вставку во вставку ... выбор ..., которая на лету получает данные о зарплате.
Показать ещё 1 комментарий
Теги:
database

1 ответ

1
Лучший ответ

Вам вообще не нужен AddSalary. У вас уже есть RoleID, поэтому выберите " Salary от Role как часть " Insert.

Private Sub AddSMButton_Click(sender As Object, e As EventArgs) Handles AddSMButton.Click
If DbConnect() Then
    Dim SQLCmd As New OleDbCommand
    If StaffID = -1 Then
        With SQLCmd
            .Connection = cn
            .CommandText = "Insert into Staff (StaffMemberFirstName, StaffMemberLastName, StaffMemberDOB, StaffMemberGender, StaffMemberContactNumber, StaffMemberEmail, StaffMemberPostcode, StaffMemberHomeAddress, StaffMemberHoursWorked, UnitID, RoleID, StaffMemberWages) " & //Add Salary to the fields being inserted
                "Select @StaffMemberFirstName, @StaffMemberLastName, @StaffMemberDOB, @StaffMemberGender, @StaffMemberContactNumber, @StaffMemberEmail, @StaffMemberPostcode, @StaffMemberHomeAddress, @StaffMemberHoursWorked, @UnitID, " &
                "@RoleID, Role.Salary FROM Role WHERE Role.RoleID = @RoleID" //I added this line
            .Parameters.AddWithValue("@StaffMemberFirstName", AddSM_FNInput.Text)
            .Parameters.AddWithValue("@StaffMemberLastName", AddSM_LNInput.Text)
            .Parameters.AddWithValue("@StaffMemberDOB", AddDOB_DTP.Value.Date)
            .Parameters.AddWithValue("@StaffMemberGender", AddSM_GInput.Text)
            .Parameters.AddWithValue("@StaffMemberContactNumber", AddSM_CNInput.Text)
            .Parameters.AddWithValue("@StaffMemberEmail", AddSM_EInput.Text)
            .Parameters.AddWithValue("@StaffMemberPostcode", AddSM_PInput.Text)
            .Parameters.AddWithValue("@StaffMemberHomeAddress", AddSM_AInput.Text)
            .Parameters.AddWithValue("@StaffMemberHoursWorked", AddHW_TB.Text)
            .Parameters.AddWithValue("@UnitID", AddU_CB.SelectedItem.Identifier)
            .Parameters.AddWithValue("@RoleID", AddR_CB.SelectedItem.Identifier)
            .ExecuteNonQuery()
            .CommandText = "Select @@Identity"
            StaffID = .ExecuteScalar
            // AddSalary(StaffID) Don't need this function anymore
        End With
        MessageBox.Show("The new record has been inserted!")
        AddSM_FNInput.Text = ""
        AddSM_LNInput.Text = ""
        AddSM_GInput.Text = ""
        AddSM_CNInput.Text = ""
        AddSM_EInput.Text = ""
        AddSM_PInput.Text = ""
        AddSM_AInput.Text = ""
        AddHW_TB.Text = ""
    End If
    cn.Close()
    StaffID = -1
End If
End Sub

Вот SQL-запрос отдельно:

Insert into Staff 
    (StaffMemberFirstName
    , StaffMemberLastName
    , StaffMemberDOB
    , StaffMemberGender
    , StaffMemberContactNumber
    , StaffMemberEmail
    , StaffMemberPostcode
    , StaffMemberHomeAddress
    , StaffMemberHoursWorked
    , UnitID
    , RoleID
    , StaffMemberWages) 
Select 
    @StaffMemberFirstName
    , @StaffMemberLastName
    , @StaffMemberDOB
    , @StaffMemberGender
    , @StaffMemberContactNumber
    , @StaffMemberEmail
    , @StaffMemberPostcode
    , @StaffMemberHomeAddress
    , @StaffMemberHoursWorked
    , @UnitID
    , @RoleID
    , Role.Salary 
FROM Role 
WHERE Role.RoleID = @RoleID
  • 0
    Извините за поздний ответ! Это хорошо, но я пытаюсь получить значение зарплаты из таблицы «Роль», которая находится под полем «Зарплата», и вставить ее в новую запись, созданную в таблице «Персонал», они не используют одни и те же имена полей, так что становится немного больно
  • 0
    Да, это выберет значение зарплаты из таблицы Role (соответствует RoleID) и вставит ее в таблицу Staff с другими значениями. Это то, что вы хотели правильно?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню