2016-03-21 2 views
0

Мой вопрос связан с подключением проекта VB.net к базе данных доступа. Должен ли я иметь первичный ключ в моей таблице, или есть способ изменить мой код, чтобы не искать ПК?Доступ к первому ключу/роль

У меня есть ошибка, которая говорит мне, что у меня нет первичного ключа. Теперь, если я сделаю «AdminID» моим основным ключом, система работает. Я просто спрашивал, требуется ли это?

В настоящее время мой ComboBox отображает "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

Есть ли веская причина ** не ** иметь ПК? – Plutonix

+1

Вся концепция дизайна базы данных зависит от таблиц с ПК. – peterG

+0

Формат моих форм и других таблиц несколько противоречит друг другу, а не огромной необходимости, но сделает вещи немного легче. Опрос моего собственного любопытства также попытался лучше понять этот код. –

ответ

4

Ваш СВО показывает AdminID, потому что это то, что вы заполните его. Если вы связать таблицу с СВО, вы можете использовать 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 положительно знать, какие «Стив» или «Боб» регистрирует в.

Также обратите внимание на что вам абсолютно не нужен DataAdapter, чтобы заполнить один стол. Также вы не нуждаетесь DataSet. Как показано, вы можете использовать метод Load с DataReader, чтобы непосредственно заполнить таблицу. Using блокирует закрытие и удаление этих объектов, освобождая ресурсы.

При привязке вы обычно используете событие SelectedValueChanged и используете .SelectedValue.

В этом случае SelectedItem будет объектом DataRowView, потому что NET создает обертку DataView. Если источником данных был List(Of Employee) или List(of Widget), то SelectedItem будет быть выбранными Employee или Widget.

+0

Спасибо, будет реализовывать сейчас! –

Смежные вопросы