Database 插入外键ID的值,而不是ID的值

Database 插入外键ID的值,而不是ID的值,database,vb.net,Database,Vb.net,我在VB.net和databases中遇到了一个问题,即在表中插入数据时,我需要插入外键的值,而不是键本身 例如,我有两个表:Employee,Department 使用以下模型 Department (DepID pk, DepName) Employee (EmpID pk, EmpName, DepID fk) 使用vb winform将数据插入员工时 我需要在DepID的位置插入DepName(或从combo中选择) NB1:我可以如此轻松地使用MS Access表单,使用列计数和宽度

我在VB.net和databases中遇到了一个问题,即在表中插入数据时,我需要插入外键的值,而不是键本身

例如,我有两个表:Employee,Department

使用以下模型

Department (DepID pk, DepName)
Employee (EmpID pk, EmpName, DepID fk)
使用vb winform将数据插入员工时

我需要在DepID的位置插入DepName(或从combo中选择)

NB1:我可以如此轻松地使用MS Access表单,使用列计数和宽度


NB2:我可以用这种方式选择数据,但我说的是操作数据,比如插入、更新、删除…

需要的是允许用户在插入新员工时选择部门名称。。而不是ID

这正是使用
ValueMember
DisplayMember
从绑定控件获得的功能:

    Dim SQL As String = "Select * FROM Department ORDER BY DeptName"
    Using cmd As New OleDbCommand(Sql, dbCon)
        myDS = New DataSet("Dept")
        Dim da As New OleDbDataAdapter(cmd)
        da.Fill(myDS, "Dept")

        frmM.cboDept.DisplayMember = "DeptName"   ' what to SHOW
        frmM.cboDept.ValueMember = "DeptID"       ' value to track
        frm.cboDept.DataSource = myDS.Tables(0)
    End Using
您可以向表单中添加适配器等以跳过代码。CBO中的每个项都将是数据库行对象,但控件将显示由
DisplayMember
指示的列中的数据,在本例中为“DeptName”

要获取值,即DeptID:

Private Sub cboDept_SelectedValueChanged(sender, e ...) 
    myEmployee.DeptID = Convert.ToInt32(cboDept.SelectedValue)
End Sub
使用ValueMember属性,我们使用
SelectedValue
属性从cbo中选择的数据行获取DeptID。数据类型将与DB列的数据类型匹配


你可以使用(部门)列表做同样的事情其中Dept是您构建的一个类,用于显示名称,但允许您检索DeptID。

类似Dept CBO的控件可以绑定到数据源,然后DisplayMember和ValueMember用于控制显示内容和所选项目的值。仅当我只希望此值独立时,这才起作用,但在我的情况下,我正在插入相关的值,根据建模和关系,employee表中的数据类型od DepID是Number,而不是text..也许您可以添加一些代码来显示您的目标,因为标题没有多大意义。如果您从CBO中选择了一个部门,您是否不希望该部门ID(PK)在Employee表中存储为部门ID(FK)?我打算使用GUI以尽可能少的代码执行此操作。我不知道您是否熟悉MS Access中的此选项。。所需的是允许用户在插入新员工时选择DepName。。而不是ID,,因为用户不应该看到ID,甚至不知道每个DepID属于哪个depName,是的,DepID pk应该作为FK存储在employee中,但是用户应该看到depName,而不是number谢谢你给了我一些好主意;)请随意点击答案旁边的复选标记别担心,一旦我得到我想要的答案,我会毫不犹豫地点击复选标记。。。但是我仍然找不到答案。。我认为VB没有access那样的属性