2013-04-28 118 views
1

我正在設計一個windows用戶窗體。您可以看到表格here,問題是絕大多數文本框永遠不會填充數據。我試圖使用表單頂部的按鈕來「瀏覽」數據庫並添加,修改和刪除記錄。多表的綁定按鈕

我似乎沒有正確的SQL查詢來抓取不同表格中的所有數據,我的DataAdapter可以將它發送到表單。我正在尋找幫助來生成正確的查詢並將數據傳遞給表單。你可以看到數據庫的構成here。如果任何人都可以幫助我,那就太棒了。

該表單的代碼如下。

Imports System.Data.OleDb 

Public Class DeviceEditorForm 
Dim tabletDataAdapter As OleDbDataAdapter 
Dim tabletDataSet As DataSet 

Private Sub DeviceEditorForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Me.DeviceTableAdapter.Fill(Me.BIT_3444_DatabaseDataSet.Device) 
    Dim sqlStatement As String = "select * from Device" 
    Dim tabletConnectionStr As String = "provider=microsoft.ace.oledb.12.0;data source=" & Application.StartupPath & "\BIT 3444 Database.accdb" 

    tabletDataAdapter = New OleDbDataAdapter(sqlStatement, tabletConnectionStr) 

    tabletDataSet = New DataSet 

    tabletDataAdapter.Fill(tabletDataSet, "Device") 

    DeviceBindingSource.DataSource = tabletDataSet.Tables(0) 
    BindingNavigator1.BindingSource = DeviceBindingSource 

    Dim batterySizeBinding As New Binding("text", DeviceBindingSource, "Battery_Size") 
    BatterySizeTextBox.DataBindings.Add(batterySizeBinding) 

    Dim IDBinding As New Binding("text", DeviceBindingSource, "ID") 
    DeviceIdTextBox.DataBindings.Add(IDBinding) 

    Dim nameBinding As New Binding("text", DeviceBindingSource, "Device_Name") 
    DeviceNameTextBox.DataBindings.Add(nameBinding) 

    Dim manufacturerBinding As New Binding("text", DeviceBindingSource, "Manufacturer") 
    ManufacturerTextBox.DataBindings.Add(manufacturerBinding) 

    Dim modelYearBinding As New Binding("text", DeviceBindingSource, "Model_Year") 
    ModelYearTextBox.DataBindings.Add(modelYearBinding) 

    Dim osBinding As New Binding("text", DeviceBindingSource, "Operating_System") 
    OperatingSystemTextBox.DataBindings.Add(osBinding) 

    Dim osVersionBinding As New Binding("text", DeviceBindingSource, "Operating_System_Version") 
    OsVersionTextBox.DataBindings.Add(osVersionBinding) 

    Dim priceBinding As New Binding("text", DeviceBindingSource, "Price") 
    PriceTextBox.DataBindings.Add(priceBinding) 

End Sub 

Private Sub ToolStripButton1_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton1.Click 
    DeviceBindingSource.EndEdit() 

    Dim tabletCommandBuilder As New OleDbCommandBuilder(tabletDataAdapter) 
    tabletDataAdapter.InsertCommand = tabletCommandBuilder.GetInsertCommand() 
    tabletDataAdapter.DeleteCommand = tabletCommandBuilder.GetDeleteCommand() 
    tabletDataAdapter.UpdateCommand = tabletCommandBuilder.GetUpdateCommand() 

    Dim numOfRecords As Integer = tabletDataAdapter.Update(tabletDataSet, "Device") 
    MsgBox(numOfRecords & " records have been updated.") 
End Sub 
End Class 

回答

1

雖然你已經在結合形式的設計方面和數據陷害你的問題,你需要回去做一些改變你的數據模型第一。您的數據模型存在一些基本問題,這會使構建應用程序變得困難。一旦解決了這些問題,您應該發現構建表單和操作數據要容易得多。

當前除[Device]之外的所有表都有一個[Device_ID] 外鍵,它指向[Device]表中的相關記錄。這使[Device]表和另一個表,並且這種關係的性質是母親(父母)可以有多個孩子但一個孩子只能有一個母親。在你的情況下,現在這種關係並不總是與你的桌子有關。

問題:Physical_Specs]作爲一個子表

有[Physical_Specs]作爲一個子表是沒有意義的。屬性[Color],[Weight]等應位於[Device]表中,因爲每個設備只能爲每個屬性設置一個值(例如,一個設備只能有一個[Weight])。此外,將[顏色],[高度],[寬度],[重量] ...的所有可能組合保存在單獨的參考表格中,以便可能與其他設備重複使用,並不會帶來真正的好處。

您應該考慮將[Connectivity]和[Storage]屬性合併到[Device]表中是否有意義。

問題:[畫面]作爲一個子表

當[畫面]是子表,你將不得不爲每一個[設備]單獨[畫面]記錄,如果多個設備使用同樣的屏幕,那麼你將不得不在[屏幕]表中複製該信息。這是倒退。實際上,單個屏幕(OEM部件)可以被許多設備使用,但是任何給定的設備將只有一個屏幕。您當前的數據模型的設置方式正好相反:設備(父級)可以有多個屏幕(子級),但屏幕記錄(子級)只能有一個父級記錄。

[Device]中的[Device]表應該具有指向相應[Screen]記錄的[Screen_ID]外鍵,而不是在[Screen]中具有[Device_ID]外鍵。這允許多個設備引用相同的[屏幕]記錄,並且每個設備將只有一個這樣的引用(即,每個設備將只有一個屏幕)。

我已經在此單獨列出了[屏幕],但同樣的推理適用於[電池]和[相機]表格。

這不是個問題:[圖片]和[點評]作爲子表

至於建議由你給這些表複數的名字,讓他們作爲子表確實意義,因爲你可以針對給定產品具有多個圖片或評論,並且這些圖片或評論中的每一個都將涉及單個設備。

+0

謝謝我承諾你推薦的更改,但現在我的綁定添加項目和刪除按鈕不起作用我收到一個SQL錯誤 – Matt 2013-04-29 01:07:08