Как сделать две вставки в две разные таблицы в VB.Net

Я пытаюсь выполнить два разных оператора INSERT одним нажатием кнопки.

Но когда я пытаюсь запустить свой код, одновременно работает только один из операторов INSERT.

Каков наилучший способ исправить это?

pro = "Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\Users\XXXX\Desktop\XXXX\XXXXX.mdb"
connstring = pro
myconnection.ConnectionString = connstring
myconnection.Open()

commmand = ("insert into ApplicationData ([lastname], [firstname],[studentbirthday],[gender], [email], [phonenumber], [address], [city], [state], [zip], [dadlastname], [dadfirstname], [momlastname],[momfirstname]) values ('" & NewLastNameText.Text & "', '" & NewFirstNameText.Text & "','" & NewDateTimePicker.Text & "','" & NewGenderText.Text & "','" & NewEmailText.Text & "','" & phone.Text & "','" & NewAddressText.Text & "','" & city.Text & "','" & state.Text & "','" & zip.Text & "','" & NewDadLNtext.Text & "','" & NewDadFNtext.Text & "','" & NewMomLNtext.Text & "','" & NewMomFNtext.Text & "')")
commmand = ("insert into StudentLogin ([username], [password]) values('" & username.Text & "','" & password.Text & "')")
Dim cmd As OleDbCommand = New OleDbCommand(commmand, myconnection)

cmd.Parameters.Add(New OleDbParameter("lastname", CType(NewLastNameText.Text, String)))
cmd.Parameters.Add(New OleDbParameter("firstname", CType(NewFirstNameText.Text, String)))
cmd.Parameters.Add(New OleDbParameter("studentbirthday", CType(NewDateTimePicker.Text, String)))
cmd.Parameters.Add(New OleDbParameter("gender", CType(NewDateTimePicker.Text, String)))
cmd.Parameters.Add(New OleDbParameter("email", CType(NewEmailText.Text, String)))
cmd.Parameters.Add(New OleDbParameter("phonenumber", CType(phone.Text, String)))
cmd.Parameters.Add(New OleDbParameter("address", CType(NewAddressText.Text, String)))
cmd.Parameters.Add(New OleDbParameter("city", CType(city.Text, String)))
cmd.Parameters.Add(New OleDbParameter("state", CType(state.Text, String)))
cmd.Parameters.Add(New OleDbParameter("zip", CType(zip.Text, String)))
cmd.Parameters.Add(New OleDbParameter("dadlastname", CType(NewDadLNtext.Text, String)))
cmd.Parameters.Add(New OleDbParameter("dadfirstname", CType(NewDadFNtext.Text, String)))
cmd.Parameters.Add(New OleDbParameter("momfirstname", CType(NewMomLNtext.Text, String)))
cmd.Parameters.Add(New OleDbParameter("momlastname", CType(NewMomFNtext.Text, String)))

cmd.Parameters.Add(New OleDbParameter("username", CType(username.Text, String)))
cmd.Parameters.Add(New OleDbParameter("password", CType(password.Text, String)))

Try
    cmd.ExecuteNonQuery()
    cmd.Dispose()
    myconnection.Close()
    MsgBox("Student Added")
    NewLastNameText.Clear()
    NewFirstNameText.Clear()
    NewEmailText.Clear()
    NewAddressText.Clear()
    NewDadLNtext.Clear()
    NewDadFNtext.Clear()
    NewMomLNtext.Clear()
    NewMomFNtext.Clear()
Catch ex As Exception

End Try

Второе присвоение командной переменной перезаписывает первое. Если вы хотите запустить несколько операторов вставки, просто разделите их точкой с запятой. Кроме того, вам действительно следует обратить внимание на параметризацию ваших запросов, см. здесь: stackoverflow.com/questions/17867192/…

dcp 10.02.2019 19:03

Вероятно, вы имеете в виду две разные таблицы, а не две разные базы данных.

Olivier Jacot-Descombes 10.02.2019 19:04
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
117
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поместите обе команды в одну строку

Dim command1 = "insert into ApplicationData ([lastname], ... values (?, ?, ...)"
Dim command2 = "insert into StudentLogin ([username], ... values (?, ?, ...)"
commmand = command1 & "; " & command2

Кстати: вы добавляете параметры (и это нормально), но не заменяете конкатенацию строк команд параметрами. Для OLEDB вы должны использовать позиционные параметры. То есть в тексте SQL вы должны использовать ? для каждого параметра. Затем вы должны добавить параметры в коллекцию параметров в том же порядке! (Имя, которое вы там используете, игнорируется, так что это не имеет значения.)


Передайте строку подключения в соединение при его создании и не изменяйте ее впоследствии. Всегда объявляйте соединение в Использование заявления. Он автоматически закрывает и удаляет соединение в конце. Обратите внимание, что создавать новые объекты соединения каждый раз, когда вы их используете, не проблема. Из-за пула соединений повторно используется «реальное» соединение.

pro = "Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\Users\XXXX\Desktop\XXXX\XXXXX.mdb"
Using myconnection As New OleDbConnection(pro)
    myconnection.Open()
    Dim command1 = "insert into ApplicationData ([lastname], ... values (?, ?, ...)"
    Dim command2 = "insert into StudentLogin ([username], ... values (?, ?, ...)"
    commmand = command1 & "; " & command2

    ...
End Using ' Automatically closes connection here.

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

Mary 10.02.2019 20:26

@ Мэри, если это так, вам придется дважды выполнить ExecuteNonQuery с двумя командами или повторно использовать один и тот же объект команды, но позаботьтесь об очистке набора параметров перед добавлением параметров для второй вставки.

Olivier Jacot-Descombes 10.02.2019 20:38
Ответ принят как подходящий

OleDb не заботятся ни об именах, ни о наших параметрах. Он заботится только о том, чтобы порядок, в котором они появляются в статусе Sql, соответствовал порядку, в котором они добавлялись в коллекцию параметров.

Конкатенация строк в операторе Sql — плохая идея по нескольким причинам и, конечно же, не нужна при использовании параметров. Метод .Add коллекции параметров очень умен и возвращает объект параметра OleDb без необходимости явного объявления. Всегда рекомендуется включать тип данных OleDb.

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'Pass the connection string directly to the constructor of the connection
    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\Users\XXXX\Desktop\XXXX\XXXXX.mdb")
        'Pass the Sql statement and the connection directly to the constructor of the command.
        'Note: this should NOT be an open connection.
        Using StudentCommand As New OleDbCommand("insert into ApplicationData ([lastname], [firstname],[studentbirthday],[gender], [email], [phonenumber], [address], [city], [state], [zip], [dadlastname], [dadfirstname], [momlastname],[momfirstname]) values (lastname, firstname,studentbirthday,gender,email,phonenumber,address,city,state,zip,dadlastname,dadfirstname,momlastname,momfirstname);", cn)
            StudentCommand.Parameters.Add("lastname", OleDbType.VarChar).Value = NewLastNameText.Text
            StudentCommand.Parameters.Add("firstname", OleDbType.VarChar).Value = NewFirstNameText.Text
            StudentCommand.Parameters.Add("studentbirthday", OleDbType.VarChar).Value = NewDateTimePicker.Text
            StudentCommand.Parameters.Add("gender", OleDbType.VarChar).Value = NewDateTimePicker.Text
            StudentCommand.Parameters.Add("email", OleDbType.VarChar).Value = NewEmailText.Text
            StudentCommand.Parameters.Add("phonenumber", OleDbType.VarChar).Value = phone.Text
            StudentCommand.Parameters.Add("address", OleDbType.VarChar).Value = NewAddressText.Text
            StudentCommand.Parameters.Add("city", OleDbType.VarChar).Value = city.Text
            StudentCommand.Parameters.Add("state", OleDbType.VarChar).Value = state.Text
            StudentCommand.Parameters.Add("zip", OleDbType.VarChar).Value = zip.Text
            StudentCommand.Parameters.Add("dadlastname", OleDbType.VarChar).Value = NewDadLNtext.Text
            StudentCommand.Parameters.Add("dadfirstname", OleDbType.VarChar).Value = NewDadFNtext.Text
            StudentCommand.Parameters.Add("momfirstname", OleDbType.VarChar).Value = NewMomLNtext.Text
            StudentCommand.Parameters.Add("momlastname", OleDbType.VarChar).Value = NewMomFNtext.Text
            'Open the connection at the last minute
            cn.Open()
            StudentCommand.ExecuteNonQuery()
            cn.Close()
        End Using 'Disposes StudentCommand
        Using LoginCommand As New OleDbCommand("insert into StudentLogin ([username], [password]) values(@username, @password;", cn)
            LoginCommand.Parameters.Add("@username", OleDbType.VarChar).Value = username.Text
            LoginCommand.Parameters.Add("@password", OleDbType.VarChar).Value = password.Text
            cn.Open()
            LoginCommand.ExecuteNonQuery()
            'We don't need to .Close the connection
            'The second End Using will close and dispose the connection
        End Using 'Disposes LoginCommand
    End Using
    MessageBox.Show("Student Added")
    NewLastNameText.Clear()
    NewFirstNameText.Clear()
    NewEmailText.Clear()
    NewAddressText.Clear()
    NewDadLNtext.Clear()
    NewDadFNtext.Clear()
    NewMomLNtext.Clear()
    NewMomFNtext.Clear()
End Sub

Одно нажатие кнопки, выполняются 2 команды.

Конечно, в реальном приложении вы НИКОГДА не сохраните пароли в виде простого текста.

Другие вопросы по теме