【问题标题】:Access Primary Key usage/role访问主键用途/角色
【发布时间】:2016-03-23 00:36:42
【问题描述】:

我的问题是关于将 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

【问题讨论】:

  • 是否有令人信服的理由进行 PK?
  • 数据库设计的整个概念取决于具有 PK 的表。
  • 我的表格和其他表格的格式有点矛盾,不是很大的必要性,但会让事情变得更容易一些。出于我自己的好奇心也想更好地理解这段代码。
  • ComboBox 当前显示“AdminID”,我希望它显示我的“AdminName”。但是,AdminID 更适合作为 PK。
  • 如果答案解决了您的问题,请单击它旁边的复选标记,以便将其从未回答列表中删除。我提到这一点是因为你还没有接受你得到的任何答案。

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


【解决方案1】:

您的 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。如图所示,您可以使用带有DataReaderLoad 方法直接填充表格。 Using 块关闭并释放这些对象以释放资源。

绑定时,一般会使用SelectedValueChanged事件并使用.SelectedValue

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

【讨论】:

  • 谢谢,马上实施!
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多