VB.Net/Access SQL插入子查询问题

VB.Net/Access SQL插入子查询问题,sql,vb.net,visual-studio,ms-access,Sql,Vb.net,Visual Studio,Ms Access,我正在制作一个可以填写的表单,并将使用按钮执行插入查询。我不知道如何在这段代码中引用另一个表。我正在尝试在表单中插入姓名、电话号码和电子邮件以及相应的分发服务器ID。获取分发服务器ID的唯一方法是引用分发服务器表。有人有什么想法吗?谢谢 私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击 provider = 0 dataFile = 0 provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=

我正在制作一个可以填写的表单,并将使用按钮执行插入查询。我不知道如何在这段代码中引用另一个表。我正在尝试在表单中插入姓名、电话号码和电子邮件以及相应的分发服务器ID。获取分发服务器ID的唯一方法是引用分发服务器表。有人有什么想法吗?谢谢

私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击

    provider = 0
    dataFile = 0
    provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    dataFile = "XXXXXXX.mdb"
    connString = provider & dataFile
    myConnection.ConnectionString = connString
    myConnection.Open()

    '*THIS IS THE PROBLEM AREA*'
    Dim str As String
    str = "INSERT INTO [Distributor Contact] ([Name], [Phone Number], [Email], [Distributor ID]) VALUES(?,?,?,?) WHERE [Distributor ID] IN (SELECT DISTINCT [Distributor ID] FROM [Distributor] WHERE [Distributor Name]= '" & ComboBox_Dist.SelectedItem.ToString() & "'))"

    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
    cmd.Parameters.Add(New OleDbParameter("Name", CType(TextBox2.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Phone Number", CType(TextBox3.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Email", CType(TextBox4.Text, String)))
    Me.Refresh()

    Try
        cmd.ExecuteNonQuery()
        cmd.Dispose()
        myConnection.Close()
        TextBox2.Clear()
        TextBox3.Clear()
        TextBox4.Clear()

        MsgBox("Contact Added")
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    myConnection.Close()

    'RE-POPULATE COMBOBOX
    ComboBox_Dist.Items.Clear()
    Dim connString1 As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= XXXXXXXXX.mdb"
    Dim con As OleDbConnection = New OleDbConnection(connString1)
    Dim adapter As OleDbDataAdapter
    Dim cmd2 As OleDbCommand
    Dim dt As DataTable = New DataTable()

    Dim sql As String = "SELECT * FROM [Distributor Contact];"

    cmd2 = New OleDbCommand(sql, con)

    Try
        con.Open()
        adapter = New OleDbDataAdapter(cmd2)

        adapter.Fill(dt)

        'Add Items To ComboBox
        For Each row In dt.Rows
            ComboBox_Dist.Items.Add(row(1))
        Next
        con.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
        con.Close()
    End Try
End Sub

将ComboBox_Dist添加为参数,然后在插入查询中使用Select而不是Values。选择允许您引用分发服务器表

cmd.Parameters.Add(New OleDbParameter("Email", CType(TextBox4.Text, String)))
cmd.Parameters.Add(New OleDbParameter("DistributorName", ComboBox_Dist.SelectedItem.ToString()))

str = "INSERT INTO [Distributor Contact] ([Name], [Phone Number], [Email], [Distributor ID]) "
str += "SELECT ?,?,?, [Distributor].[DistributorID] "
str += "FROM [Distributor] WHERE [Distributor].[Distributor Name] = ?"

这是将来任何人的最终工作代码

    provider = 0
    dataFile = 0
    provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    dataFile = "XXXXXXXX.mdb"
    connString = provider & dataFile
    Dim str As String
    str = "INSERT INTO [Distributor Contact] ([Contact Name], [Phone Number], [Email], [Distributor ID])"
    str += "SELECT ?,?,?,[Distributor].[Distributor ID]"
    str += "FROM [Distributor] WHERE [Distributor].[Distributor Name] = ?"

    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
    cmd.Parameters.Add(New OleDbParameter("Contact Name", CType(TextBox2.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Phone Number", CType(TextBox3.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Email", CType(TextBox4.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Distributor Name", ComboBox_Dist.SelectedItem.ToString()))

    Me.Refresh()

六羟甲基三聚氰胺六甲醚。。。。我做了更改,现在在新的ComboBox\u Dist参数行上出现错误。错误消息:“没有为一个或多个必需参数提供值。对象引用未设置为对象的实例。”听起来像ComboBox\u Dist.SelectedItem为null/nothing。在运行代码之前,您必须验证它是否有值。我可以通过MsgBox验证ComboBox\u Dist.SelectedItem.ToString()是否正确地保存了值。您是否也保留了其他参数?我删掉了前两个,因为我不想粘贴你所有的代码。是的,我保留了它们。