2016-03-21 23 views
0

Soruma bir VB.net projesinin bir Access DB'ye bağlanmasıyla ilgili. Masamda bir birincil anahtar olmalı mı yoksa bir PK'ye bakmamak için kodumu değiştirmenin bir yolu var mı?Başlangıç ​​Birincil Anahtar kullanımı/rol

Bana birincil anahtarın olmadığını söyleyen bir hatam var. Şimdi "AdminID" i birincil anahtarım yaparsam, sistem çalışır. Sadece bunun gerekli olup olmadığını soruyordum?

anda benim combobox görüntüler Doğrusu bu "AdminName"

Teşekkür görüntülendiği gibi "AdminID". o Eğer doldurun budur çünkü

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

Zorunlu bir neden ** var mı ** PK almak için? – Plutonix

+1

Tüm veritabanı tasarımı PK'ye sahip tablolara dayanır. – peterG

+0

Formlarımın ve diğer tabloların formatı birbiriyle biraz çelişiyor, büyük bir zorunluluk değil, işleri biraz kolaylaştırıyor. Kendi merakımdan da çıkarak bu kodu daha iyi anlamaya çalışmak. –

cevap

4

Kişisel CBO AdminID göstermektedir. Eğer CBO tabloyu bağlamak varsa, kodunuzu başka dönmek için ValueMember bir şey göstermek için DisplayMember kullanabilirsiniz ve:

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 

Unutulmaması gereken ilk şey doldurmak için hiçbir kod olmasıdır CBO doğrudan. Bir DataSource kullanarak, cbo, verileri alttaki tablodan alır. DisplayMember hangi sütunun de, ekrana ... bunu söyler ve ValueMember kodunuzu PrimaryKey/Kimliği olumlu "Steve" veya "Bob" giriş olduğunu öğrenmek amacıyla ilgili getirmenin mümkün olmasını sağlar.

Ayrıca dikkat Sadece bir tabloyu doldurmak için DataAdapter'a ihtiyacınız yoktur. Ne de 'a ihtiyacınız var. Gösterildiği gibi, bir tabloyu doğrudan doldurmak için DataReader ile Load yöntemini kullanabilirsiniz. Using blokları, kaynakları serbest bırakan nesneleri kapatır ve elden çıkarır.

Bağlandığında, genellikle SelectedValueChanged olayını kullanır ve .SelectedValue'u kullanırsınız. Bu durumda, SelectedItem bir DataRowView nesnesi olur, çünkü NET bir DataView sarmalayıcı oluşturur. Veri kaynağı bir List(Of Employee) veya bir List(of Widget) ise, SelectedItem, seçmeli veya Widget olacaktır.

+0

Teşekkürler, şimdi uygulayacak! –

İlgili konular