我的问题是关于将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
答案 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
将 选定的Employee
或Widget
。