首页 > 解决方案 > 如何在 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

标签: sqlvb.netms-access

解决方案


将两个命令放入同一个字符串

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

顺便说一句:您正在添加参数(这很好),但没有用参数替换命令的字符串连接。对于 OLEDB,您必须使用位置参数。即,在 SQL 文本中,您必须?为每个参数使用一个。然后你必须以相同的顺序将参数添加到参数集合中!(您在那里使用的名称被忽略,所以没关系。)


在创建连接时将连接字符串传递给连接,之后不要更改它。始终在Using Statement中声明连接。它会自动关闭并在最后处理连接。请注意,每次使用连接对象时都创建新的连接对象不是问题。由于连接池,“真实”连接将被重用。

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.

推荐阅读