2013-04-28 80 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