关系如何运作以及我如何在我的项目中实施它?

How do relationships work and how can I implement it in my project?

我有一个用户 table 和机构 table。我已经与那两个建立了关系。 Inst id 现在作为外键在用户 table 中。

在我的 vb 表单中,我使用 inst table 中的机构名称填充了一个组合框。当我 select 列表框中的用户名时,his/hers 相关详细信息将被捕获到表单的文本框中。但是我不知道如何使用外键捕获机构名称。

'actions when listbox selection is changed
Private Sub listbox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    cbInst_putData()
    cbAccountType_putData()
    If gbEditUser.Visible = True Then
        Dim selected_item As String = ListBox1.SelectedItem

        qr = "Select * FROM [User] WHERE Username = '" & selected_item & "'"
        Using cn As New OleDbConnection(cnString)
            cn.Open()
            Using cmd As New OleDbCommand(qr, cn)
                Dim reader As OleDbDataReader = cmd.ExecuteReader
                While reader.Read
                    txtFirstname_edit.Text = reader.Item("Firstname").ToString
                    txtLastname_edit.Text = reader.Item("Lastname").ToString
                    txtAddress_edit.Text = reader.Item("Address").ToString
                    txtPhone_edit.Text = reader.Item("Phone").ToString
                    Dim dt As Date = Date.Parse(reader.Item("DateofBirth").ToString)
                    txtdob_edit.Text = dt
                    txtUsername_edit.Text = reader.Item("Username").ToString
                    txtPassword_edit.Text = reader.Item("Password").ToString
                    cbAccountType_edit.SelectedItem = reader.Item("AccountType").ToString
                    cbInst_edit.Text = reader.Item("InstitutionIDFK").ToString ' this is the combobox for institution list.
                    txtDesc.Text = reader.Item("Description").ToString
                    Dim checkActive As String
                    checkActive = reader.Item("Active").ToString
                   End While
            End Using
            cn.Close()
        End Using
    End If
End Sub

我想将机构名称存储在用户table中,并且还可以再次捕获它。我之前没有建立关系就做到了。通过在用户 table.

中单独设置机构字段

我对 vb 很陌生。即使我一直在查看本网站上的其他问题,也完全不熟悉在这里发帖。所以如果我的代码不好或者我没有正确发布,请原谅我。

执行以下操作:

  1. 确保您创建了关系(一对多)。
  2. 创建一个新查询并添加两个表。
  3. 在查询中添加两个表中的所有字段(外键除外)。
  4. 将查询作为您的 Form.
  5. 的数据源

假设我的烘焙师是机构,我的咖啡是用户。

我将列表框和组合框绑定到Form.Load中的数据。

当 ListBox 中的 selection 发生变化时,我们将获得与 selection 关联的 RoasterId(外键)。接下来,我们遍历 ID 字段中组合框主键中的项目。当我们找到匹配项时,select 该项目并退出循环。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim RoastersSql = "Select * From Roasters;"
    Dim CoffeesSql = "Select Top 10 * From Coffees;"
    Dim RoastersDT As New DataTable
    Dim CoffeeDT As New DataTable
    Using cn As New SqlConnection(ConGD)
        Using cmd As New SqlCommand(RoastersSql, cn)
            cn.Open()
            Using reader = cmd.ExecuteReader
                RoastersDT.Load(reader)
            End Using
        End Using
        Using cmd As New SqlCommand(CoffeesSql, cn)
            Using reader = cmd.ExecuteReader
                CoffeeDT.Load(reader)
            End Using
        End Using
    End Using
    ListBox1.DisplayMember = "Name"
    ListBox1.ValueMember = "ID" 'NOT the RoasterID, this is th PK of the Coffees table
    ListBox1.DataSource = CoffeeDT
    ComboBox1.DisplayMember = "Name"
    ComboBox1.ValueMember = "ID"
    ComboBox1.DataSource = RoastersDT
    UpdateUI(ListBox1.SelectedItem)
End Sub

Private Sub FillTextBoxes(item As Object)
    Dim drv = DirectCast(item, DataRowView)
    TextBox1.Text = drv("Name").ToString
    TextBox2.Text = drv("Type").ToString
End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    UpdateUI(ListBox1.SelectedItem)
End Sub

Private Sub UpdateUI(item As Object)
    Dim RoasterID = CInt(DirectCast(ListBox1.SelectedItem, DataRowView)("RoasterID"))
    For Each item In ComboBox1.Items
        Dim ID = CInt(DirectCast(item, DataRowView)("ID"))
        If RoasterID = ID Then
            ComboBox1.SelectedItem = item
            Exit For
        End If
    Next
    FillTextBoxes(ListBox1.SelectedItem)
End Sub