1

Windows ユーザーフォームを設計しています。ここでフォームを確認できます。問題は、ほとんどのテキスト ボックスにデータが入力されていないことです。フォームの上部にあるボタンを使用して、データベースを「参照」し、レコードを追加、変更、および削除しようとしています。

DataAdapterフォームに送信できるように、さまざまなテーブルからすべてのデータを取得するための適切な SQL クエリがないようです。適切なクエリを生成し、データをフォームに渡す方法を教えてください。データベースの構成はこちらで確認できます。誰かが私を助けることができれば、それは素晴らしいことです.

フォームのコードは以下です。

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
4

1 に答える 1

1

フォームのデザインとデータ バインディングの観点から質問を組み立てましたが、最初に戻ってデータ モデルにいくつかの変更を加える必要があります。データ モデルには、アプリケーションの構築を困難にする根本的な問題がいくつかあります。それらが解決されると、フォームの作成とデータの操作がはるかに簡単になるはずです。

現在、[Device] を除くすべてのテーブルには、[Device] テーブルの関連レコードを指す[Device_ID]外部キーがあります。これにより、 [Device] テーブルがParentになり、他のテーブルがChildになります。その関係の性質は、マザー (親) は複数の子を持つことができますが、子は 1 つのマザーしか持てないということです。あなたの場合、その関係は、現在のテーブルでは常に意味があるとは限りません。

問題: [Physical_Specs] を子テーブルとして

[Physical_Specs] を子テーブルとして持つことは意味がありません。[Color]、[Weight] などの属性は、[Device] テーブルにある必要があります。これは、各デバイスがこれらの属性ごとに 1 つの値しか持てないためです (たとえば、デバイスは [Weight] を 1 つしか持てません)。さらに、[色]、[高さ]、[幅]、[重量] のすべての可能な組み合わせを別の参照テーブルに保存して、他のデバイスで再利用できるようにしても、実際の利点はありません。

[Connectivity] 属性と [Storage] 属性を [Device] テーブルにも組み込むことに意味があるかどうかを検討する必要があります。

問題: [画面] を子テーブルとして

[画面] が子テーブルの場合、[デバイス] ごとに個別の [画面] レコードを維持する必要があります。複数のデバイスが同じ画面を使用する場合は、[画面] テーブルにその情報を複製する必要があります。それは後ろ向きです。実際には、1 つの画面 (OEM パーツ) を多くのデバイスで使用できますが、特定のデバイスには 1 つの画面しかありません。現在のデータ モデルの設定方法は逆です。デバイス (親) は複数の画面 (子) を持つことができますが、画面レコード (子) は 1 つの親レコードしか持つことができません。

[Screen] に [Device_ID] 外部キーを持つ代わりに、[Device] テーブルには、適切な [Screen] レコードを指す [Screen_ID] 外部キーが必要です。これにより、複数のデバイスが同じ [Screen] レコードを参照できるようになり、各デバイスにはそのような参照が 1 つだけあります (つまり、各デバイスには 1 つの画面しかありません)。

ここでは [画面] を選び出しましたが、[バッテリー] と [カメラ] の表にも同じ理由が当てはまります。

問題ありません: [Pictures] と [Reviews] を子テーブルとして

これらのテーブルに付けた複数の名前が示唆するように、特定の製品に対して複数の写真やレビューがあり、それらの写真やレビューのそれぞれが単一のデバイスを参照する可能性があるため、それらを子テーブルとして持つことは理にかなっています。

于 2013-04-28T10:11:17.860 に答える