Projektplanung DataSet/DataTable typisiert

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Projektplanung DataSet/DataTable typisiert

    Moin moin

    Ich bin dabei ein kleines Project umzusetzen. Im groben habe ich meine Vorstellungen bzgl des Aufbaus fertig. Anfallende Daten werden letztlich in einer SQLight-DB abgelegt. Das hier kein Passwortschutz möglich ist, ist nicht weiter schlimm, da keine so wichtigen persönlichen Daten gespeichert werden. Zumindest kann ich hier mit 64Bit arbeiten, was leider bei Access 2003 DBs nicht geht.

    Daten Eingabe der Daten und das Anzeigen dieser geht über DGVs auf einem TabControl. Siehe Bild.

    Vorgaben: Drei (3) Mess-Stationen in drei Räumen. Die Werte werden bis jetzt 2-Mal Täglich abgelesen. Das kann sich noch auf 3-Mal Täglich ändern.
    Die DGV zeigen immer den kompletten Monat an. Später sollen Mittelwerte etc berechenbar und Graphische Anzeigen dieser möglich sein.

    Bevor ich nun mit der DB und dem ganzen anderem beginne, steht die Planung des DS und der DT an.

    Ich verfolge dabei 2 Grundideen. Siehe Bild.

    Ein gemeinsames DataSet.
    • Ein DT für alle Messtationen, wobei jede ihre eigne "StationID" bekommt.
    • Für jede Messtation ein eigenes DT.

    • Welche Variante wäre hier zu empfehlen oder gibt es evtl noch eine andere Möglichkeiten?
    • Kommen sich ggf die drei DGV in den DT in die Quere?
    • Kann ich eine Graphische Anzeige usw. aller Daten realisieren, wenn ich mit 3 DT arbeite? (Z.B. Drei Linien auf einem Chat, Temperatur/Tag von jeder Mess-Station)

    Bin für jede Hilfe / Idee offen... Danke :)

    *Topic verschoben*
    Bilder
    • DS_DT1.jpg

      175,65 kB, 808×279, 75 mal angesehen
    • DS_DT2.jpg

      78,89 kB, 444×245, 66 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Eine Tabelle für alle 3 Stationen. Aber
    Tabelle1: ID, Stationsname
    Tabelle2: ID, StationsID, alle Messwerte.
    1:N nennt sich dieses "Datenverhältnis". Du hast z.B. eine Station und zu dieser einen Station hast Du N Messwertpakete. N ist eine beliebige Zahl, die wiedergibt, wieviele Messwertpakete Du für diese Station gesammelt hast.

    Amelie schrieb:

    Kommen sich ggf die drei DGV in den DT in die Quere?
    Die Frage ergibt inhaltlich keinen Sinn, aber ich übersetze mal und sage: nein, da die DGVs eben über die BindingSources so eingestellt werden können, dass nur Daten je einer Station angezeigt werden. Und ein 4. DGV könnte die Daten aller Stationen anzeigen. Oder die Daten aller Stationen der vergangenen sieben Tage. Oder alle Werte, die eine bestimmte Messwertgrenze überschritten haben. Wie Du willst.
    Die grafische Anzeige, z.B. über ein Chart ist kein Problem, da mehrere sog. Series angelegt werden können, wodurch einfach z.B. 3 Kurvenverläufe angezeigt werden. Aber das sollte erst Thema sein, wenn die Grundeinstellungen passen.
    Die Benennung Deiner Tabellen: wenn englisch, dann richtig: Daily, nicht Dayli. Nicht DeutschEnglischMischmasch, sondern entweder oder. Ich bevorzuge für meinen Code englische Begriffe, da die Programmiersprache aus englischen Begrifflichkeiten besteht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Also ich habe nun neue DT erstellt und die Beziehung gemacht. Das gleiche dann mit dem SqlStudio für die Datenbank.
    Ich hoffe das die Einstellungen da so richtig sind.
    Siehe Bilder. :)
    Bilder
    • DB_SqLight1.jpg

      368 kB, 1.035×546, 63 mal angesehen
    • DS_DT3.jpg

      96,3 kB, 580×281, 64 mal angesehen
    • DB_SqLight2.jpg

      291,39 kB, 980×496, 72 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Sieht sinnvoll aus, auch wenn ich das DB-GUI nicht kenne. Aber das ist egal.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann müsste wohl das mit der Luftfeuchtigkeit auch abgetrennt werden.
    Oder eine Tabelle, bestehend aus Temperatur und Luftfeuchtigkeit.
    Dann braucht es aber auch Zeitpunkte in den abgetrennten Tabellen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    So würd ichs machen:

    Tabelle Tageszeit, Spalte ID, Name, enthält 3 Stammdatensätze: "Morgens", "Mittags", "Abends"
    Tabelle Measurement enthält StationID, TagesZeitID, Temperatur, Luftfeuchte, also je eine Messung: Temp + Feuchte

    Relationen:
    Station->Measurement<-Tageszeit

    (Und ich würds natürlich DatasetOnly machen. SqlLite finde ich ganz unnütz - ist ja auch nur eine Datei.)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Moin moin
    Danke noch für die ganzen zusatzinfos / ideen.
    Also mit SqLight bekomme ich es so nicht hin. Irgendwie sträubt sich da immer etwas, so dass ich nun schon fast von SqLight wegkomme.
    Mit Access 2003 war es relativ schnell gemacht die Tabellen und Beziehungen zu erstellen, ebenso konnte ich damit eine weitere Tabelle erstellen für die Abfragen der Mittelwerte. Der Haken ist, das die nur mit 32Bit geht. Wer weis wie lange das noch unterstützt wird.

    Ich werde es heute mal mit dem reinen DataSet versuchen.
    Zeige später mal was ich so hinbekomme.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hallo

    So habe mein DataSet und DataTables usw. nun fertig. Dadurch das sich etwas an den Messdaten geändert hat, bin ich mit einem DT ausgekommen.
    Habe das nun so gemacht, das ich die Daten sowohl in einem "XML-File" oder in einer "SqLight-DB" ablegen kann.

    Dazu brauche ich nur diese Klasse hier entsprechend ändern.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SaveLoadXml
    2. Private dataManager As DataManager
    3. Private DsClima As DsClima
    4. Public Event Success(success As Boolean)
    5. 'Private ReadOnly DataBaseName As String = "A:\HomeClimaBackup\Datas2\HomeClima.db"
    6. 'Private DBPath As String
    7. 'Private connectionString As String
    8. Public Sub New(dataManagerInstance As DataManager)
    9. dataManager = dataManagerInstance
    10. 'DBPath = Path.Combine(dataManager.Directory, DataBaseName)
    11. 'connectionString = $"Data Source={DBPath};Version=3;"
    12. End Sub
    13. Public Sub SaveDatasXml(DsClima As DsClima)
    14. Try
    15. DsClima.WriteXml(dataManager.FilePath)
    16. RaiseEvent Success(True)
    17. 'MessageBox.Show($"Die Daten wurden erfolgreich in{Environment.NewLine}{dataManager.FilePath} gespeichert.")
    18. Catch ex As Exception
    19. MessageBox.Show($"Fehler beim Speichern der Daten: {ex.Message}")
    20. End Try
    21. End Sub
    22. Public Sub LoadDataFromXML(DsClima As DsClima)
    23. Try
    24. If File.Exists(dataManager.FilePath) Then
    25. DsClima.Clear()
    26. DsClima.ReadXml(dataManager.FilePath)
    27. Else
    28. MessageBox.Show("Die XML-Datei konnte nicht gefunden werden.")
    29. End If
    30. Catch ex As Exception
    31. MessageBox.Show($"Fehler beim Laden der Daten aus XML: {ex.Message}")
    32. End Try
    33. End Sub
    34. 'Public Sub SaveDatasSql(DsClima As DsClima)
    35. ' Try
    36. ' Using connection As New SQLiteConnection(connectionString)
    37. ' connection.Open()
    38. ' ' Speichere die Daten in der SQLite-Datenbank
    39. ' Using command As New SQLiteCommand("INSERT INTO Messwerte (Station, Datum, Temperatur1, Temperatur2, Temperatur3, Humidity1, Humidity2, Humidity3, Notizen) VALUES (@Station, @Datum, @Temperatur1, @Temperatur2, @Temperatur3, @Humidity1, @Humidity2, @Humidity3, @Notizen)", connection)
    40. ' For Each row As DataRow In DsClima.Tables("Messwerte").Rows
    41. ' 'command.Parameters.AddWithValue("@ID", row("ID"))
    42. ' command.Parameters.AddWithValue("@Station", row("Station"))
    43. ' command.Parameters.AddWithValue("@Datum", row("Datum"))
    44. ' command.Parameters.AddWithValue("@Temperatur1", row("Temperatur1"))
    45. ' command.Parameters.AddWithValue("@Temperatur2", row("Temperatur2"))
    46. ' command.Parameters.AddWithValue("@Temperatur3", row("Temperatur3"))
    47. ' command.Parameters.AddWithValue("@Humidity1", row("Humidity1"))
    48. ' command.Parameters.AddWithValue("@Humidity2", row("Humidity2"))
    49. ' command.Parameters.AddWithValue("@Humidity3", row("Humidity3"))
    50. ' command.Parameters.AddWithValue("@Notizen", row("Notizen"))
    51. ' command.ExecuteNonQuery()
    52. ' command.Parameters.Clear()
    53. ' Next
    54. ' End Using
    55. ' RaiseEvent Success(True)
    56. ' MessageBox.Show("Die Daten wurden erfolgreich in der SQLite-Datenbank gespeichert.")
    57. ' End Using
    58. ' Catch ex As Exception
    59. ' Debug.WriteLine($"Fehler beim Speichern der Daten in SQLite: {ex.Message}")
    60. ' MessageBox.Show($"Fehler beim Speichern der Daten in SQLite: {ex.Message}")
    61. ' End Try
    62. 'End Sub
    63. 'Public Sub UpdateDatasSql(DsClima As DsClima)
    64. ' Try
    65. ' Using connection As New SQLiteConnection(connectionString)
    66. ' connection.Open()
    67. ' ' Aktualisiere die Daten in der SQLite-Datenbank
    68. ' Using command As New SQLiteCommand("UPDATE Messwerte SET Temperatur1 = @Temperatur1, Temperatur2 = @Temperatur2, Temperatur3 = @Temperatur3, Humidity1 = @Humidity1, Humidity2 = @Humidity2, Humidity3 = @Humidity3, Notizen = @Notizen WHERE ID = @ID", connection)
    69. ' For Each row As DataRow In DsClima.Tables("Messwerte").Rows
    70. ' command.Parameters.AddWithValue("@ID", row("ID"))
    71. ' command.Parameters.AddWithValue("@Temperatur1", row("Temperatur1"))
    72. ' command.Parameters.AddWithValue("@Temperatur2", row("Temperatur2"))
    73. ' command.Parameters.AddWithValue("@Temperatur3", row("Temperatur3"))
    74. ' command.Parameters.AddWithValue("@Humidity1", row("Humidity1"))
    75. ' command.Parameters.AddWithValue("@Humidity2", row("Humidity2"))
    76. ' command.Parameters.AddWithValue("@Humidity3", row("Humidity3"))
    77. ' command.Parameters.AddWithValue("@Notizen", row("Notizen"))
    78. ' command.ExecuteNonQuery()
    79. ' command.Parameters.Clear()
    80. ' Next
    81. ' End Using
    82. ' RaiseEvent Success(True)
    83. ' MessageBox.Show("Die Daten wurden erfolgreich in der SQLite-Datenbank aktualisiert.")
    84. ' End Using
    85. ' Catch ex As Exception
    86. ' Debug.WriteLine($"Fehler beim Aktualisieren der Daten in SQLite: {ex.Message}")
    87. ' MessageBox.Show($"Fehler beim Aktualisieren der Daten in SQLite: {ex.Message}")
    88. ' End Try
    89. 'End Sub
    90. 'Public Sub LoadDataFromSQL(DsClima As DsClima)
    91. ' Try
    92. ' Using connection As New SQLiteConnection(connectionString)
    93. ' connection.Open()
    94. ' ' Lade die Daten aus der SQLite-Datenbank
    95. ' Using command As New SQLiteCommand("SELECT * FROM Messwerte", connection)
    96. ' Using reader As SQLiteDataReader = command.ExecuteReader()
    97. ' DsClima.Tables("Messwerte").Load(reader)
    98. ' End Using
    99. ' End Using
    100. ' End Using
    101. ' Catch ex As Exception
    102. ' MessageBox.Show($"Fehler beim Laden der Daten aus SQLite: {ex.Message}")
    103. ' End Try
    104. 'End Sub
    105. 'Private Sub CreateDataTable(connection As SQLiteConnection)
    106. ' ' Erstelle die Tabelle, falls sie noch nicht existiert
    107. ' Using command As New SQLiteCommand("CREATE TABLE IF NOT EXISTS ClimaData (ID INTEGER, Station INTEGER, Datum TEXT, Temperatur1 REAL, Temperatur2 REAL, Temperatur3 REAL, Humidity1 INTEGER, Humidity2 INTEGER, Humidity3 INTEGER)", connection)
    108. ' command.ExecuteNonQuery()
    109. ' End Using
    110. 'End Sub
    111. End Class



    Auch das mit den "Arbeitsblättern" quasi wie ein ExcelSheet habe ich nun in eine separate Klasse ausgelagert.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SheetFileCreator
    2. Private DataManager As DataManager
    3. Public Sub New(dataManagerInstance As DataManager)
    4. DataManager = dataManagerInstance
    5. End Sub
    6. Public Event Success(success As Boolean)
    7. Private DsClima As New DsClima()
    8. Public Sub CreateDummiFile()
    9. Try
    10. ' Überprüfen, ob die Tabelle bereits im DataSet vorhanden ist
    11. Dim tableName As String = "Messwerte"
    12. If DsClima.Tables.Contains(tableName) Then
    13. DsClima.Tables.Remove(tableName)
    14. End If
    15. ' Je einen Datensatz erstellen für Station1, Station2, Station3
    16. Dim stationTable As New DataTable(tableName)
    17. Dim idColumn As New DataColumn("ID", GetType(Integer))
    18. idColumn.AutoIncrement = True
    19. idColumn.AutoIncrementSeed = 1
    20. idColumn.AutoIncrementStep = 1
    21. stationTable.Columns.Add(idColumn)
    22. stationTable.Columns.Add("Station", GetType(Integer))
    23. stationTable.Columns.Add("Datum", GetType(Date))
    24. stationTable.Columns.Add("Temperatur1", GetType(Double))
    25. stationTable.Columns.Add("Temperatur2", GetType(Double))
    26. stationTable.Columns.Add("Temperatur3", GetType(Double))
    27. stationTable.Columns.Add("Humidity1", GetType(Double))
    28. stationTable.Columns.Add("Humidity2", GetType(Double))
    29. stationTable.Columns.Add("Humidity3", GetType(Double))
    30. stationTable.Columns.Add("Notizen", GetType(String))
    31. For num As Integer = 1 To 3 ' Drei Stationen
    32. ' Das aktuelle Datum
    33. Dim currentDate As Date = DataManager.CurDatum
    34. Dim daysInMonth As Integer = DateTime.DaysInMonth(currentDate.Year, currentDate.Month)
    35. ' Zeilen zur DataTable hinzufügen
    36. For i As Integer = 1 To daysInMonth
    37. Dim newRow As DataRow = stationTable.NewRow()
    38. newRow("Station") = num
    39. newRow("Datum") = CDate(New Date(currentDate.Year, currentDate.Month, i))
    40. ' DataRow zur DataTable hinzufügen
    41. stationTable.Rows.Add(newRow)
    42. Next
    43. Next
    44. ' DataTable zur DataSet hinzufügen
    45. DsClima.Tables.Add(stationTable)
    46. ' Speichern des DataSet in die XML-Datei mit dem richtigen Datum
    47. DsClima.WriteXml(DataManager.FilePath)
    48. Debug.WriteLine($"ok: {DataManager.FilePath}")
    49. RaiseEvent Success(True)
    50. Catch ex As Exception
    51. ' Debug wird später durch einen Logger ersetzt.
    52. Debug.WriteLine($"Fehler: {ex.Message}")
    53. RaiseEvent Success(False)
    54. End Try
    55. End Sub
    56. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: