访问主键使用/角色

时间:2016-03-21 22:10:57

标签: .net database vb.net ms-access primary-key

我的问题是关于将VB.net项目连接到Access DB。 我必须在我的表中有一个主键,或者有没有办法改变我的代码而不是寻找PK?

我弹出一个错误告诉我我没有主键。现在,如果我将“AdminID”作为主键,则系统可以正常工作。我只是质疑这是否是必需的?

目前我的组合框显示“AdminID”,我希望它显示“AdminName”

感谢。

Dim objConnection As New   OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= InfoSystem.accdb")
Dim objAdminDA As New OleDb.OleDbDataAdapter("Select *from tblAdmins", objConnection)
Dim objAdminCB As New OleDb.OleDbCommandBuilder(objAdminDA)
Dim objDataSet As New DataSet()

Public Sub Retrieve()

    'Clears DataSet of any existing data
    objDataSet.Clear()
    'Fills schema - adds table structure information to DataSet
    objAdminDA.FillSchema(objDataSet, SchemaType.Source, "tblAdmins")
    'Fills DataSet with info from the DataAdapter
    objAdminDA.Fill(objDataSet, "tblAdmins")

    'Fill the DataSet with info from the Admin table
    objAdminDA.FillSchema(objDataSet, SchemaType.Source, "tblAdmins")
    objAdminDA.Fill(objDataSet, "tblAdmins")

    'Empty combo box
    cboxAdmin.Items.Clear()

    'Loop through each row, adding the AdminName to the combo box
    Dim i As Integer, strAdminID As String
    For i = 1 To objDataSet.Tables("tblAdmins").Rows.Count
        strAdminID = objDataSet.Tables("tblAdmins").Rows(i - 1).Item("AdminID")
        cboxAdmin.Items.Add(strAdminID)
    Next
    'Select first item in the list
    cboxAdmin.SelectedIndex = 0

    FillAdminDetails()

End Sub

Public Sub FillAdminDetails()
    Dim objRow As DataRow
    objRow = objDataSet.Tables("tblAdmins").Rows.Find(cboxAdmin.SelectedItem.ToString)
    txtStaffDept.Text = objRow.Item("Department")
    txtStaffTitle.Text = objRow.Item("Title")
End Sub

Private Sub cboxAdmin_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboxAdmin.SelectedIndexChanged
    FillAdminDetails()
End Sub

End Sub

1 个答案:

答案 0 :(得分:4)

您的CBO会显示AdminID,因为这就是您填写的内容。如果您表格绑定到CBO,您可以使用DisplayMember来展示一件事,并ValueMember将另一个表格返回给您的代码:

Private ACEConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= InfoSystem.accdb"
Private dtAdmin As DataTable
...
Private Sub SetupCBO
    Dim SQL = "SELECT AdminId, AdminName FROM tblAdmin"

    Using dbcon As New OleDbConnection(ACEConnStr)
        Using cmd As New OleDbCommand(SQL, dbcon)

            dbcon.Open()
            dtAdmin = New DataTable

            dtAdmin.Load(cmd.ExecuteReader())
        End Using
    End Using

    cboAdmin.DataSource = dtAdmin
    cboAdmin.DisplayMember = "AdminName"     ' what to show
    cboAdmin.ValueMember = "AdminId"         ' what field to report
End Sub

首先要注意的是,没有代码可以直接填充CBO。使用DataSource,cbo将从基础表中获取数据。 DisplayMember告诉它哪个列...好,显示,ValueMember允许您的代码能够获取该PrimaryKey / Id以确定知道哪个" Steve"或者" Bob"正在登录。

另请注意,您绝对不需要DataAdapter来填充一张桌子。你也不需要 DataSet。如图所示,您可以使用Load方法和DataReader直接填充表格。 Using块关闭并处理释放资源的那些对象。

绑定时,您通常会使用SelectedValueChanged事件并使用.SelectedValue

在这种情况下,SelectedItem将是DataRowView对象,因为NET会创建一个DataView包装器。如果数据源为List(Of Employee)List(of Widget),则SelectedItem 选定的EmployeeWidget