Dataset only -> DB / Welches System und wie?

  • VB.NET
  • .NET 4.0

Es gibt 72 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Läuft nun alles wie gewünscht, DataSet ist komplett mit Daten in die Datenbank integriert und laden, speichern, update etc. funzt wie es soll :thumbup:
    Vielen Dank nochmal an @ErfinderDesRades für deine Hilfe. Dann kann das Projekt nun mit ein paar Leuten durchgetestet werden :thumbsup:
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @ErfinderDesRades:

    Ist es möglich den folgenden Codeblock so umzubauen, dass er eine gewählte Tabelle, samt übergeordneten leert und neu befüllt aus der Datenbank heraus?
    Oder reicht es nur die betroffene Tabelle zu leeren und neu zu laden?

    VB.NET-Quellcode

    1. Public Sub CustomFill(table As DataTable, sqlAfterFrom As String, ParamArray args() As Object)
    2. ClearRecursive(table)
    3. Using adp = DirectCast(DirectCast(_Adapters(table), ICloneable).Clone, OleDbDataAdapter)
    4. Dim cmd = adp.SelectCommand
    5. cmd.CommandText &= " " & sqlAfterFrom
    6. For i = 0 To args.Length - 1
    7. cmd.Parameters.AddWithValue("@p" & i, args(i))
    8. Next
    9. _Con.Open()
    10. adp.Fill(table)
    11. _Con.Close()
    12. End Using
    13. End Sub


    Ich hab' damit vor, dass vor jeder Bearbeitung eines Datensatzes die Tabellen neu initialisiert werden - anstelle des ganzen DataSets, sodass auch
    die aktuellen Daten im Dataset vorhanden sind.

    Also ich hab mir sowas vorgestellt wie
    clearRecursive(table) -> gibt's ja schon
    fillRecursive(table) -> da wüsste ich aber nicht wie ich das bauen soll
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    Uih - da hab ich mal einen mördermässigen Sql-Generator gebastelt, der konnte glaub sowas: "Lade diese Datensätze, und alle untergeordneten".
    Aber müsste ich suchen, und untersuchen, ob das noch funktioniert.
    Ist glaubich in dem Monster-Projekt, von dem ich den Namen vergessen halb - iwas wie "allgemeine Lösung...." muss ja im Datenbank-Bereich sein.

    ErfinderDesRades schrieb:

    : "Lade diese Datensätze, und alle untergeordneten".

    Müsste hier ja sogar umgekehrt sein - lade alle übergeordneten Tabellen und dann diese...

    Aktuell ist's so eingestellt dass sobald ein Programm-Modul aufgemacht wird, das DataSet neu befüllt wird. Dadurch, dass die .mdb-Datei nun auf einem
    Netzlaufwerk liegt, sorgt das für ordentlich Verzögerung. Meine Hoffnung hier ist, dass das schneller abläuft wenn eben nicht das komplette DTS neu befüllt wird,
    sondern "nur" die zusammenhängenden Tabellen.

    Also wenn ich sage "öffne Standort-Stammdaten" soll er die Tabelle Standort mit allen übergeordneten Tabellen neu einlesen. Das können u.U. auch sehr viele sein aber nicht alle ;)

    Wäre also super wenn du hier eine Lösung dazu hättest. ClearRecursive gibt es ja schon, ich brauche also noch ein FillRecursive

    Dann könnte man beim Öffnen eines Programmteils sowas hier veranstalten:

    VB.NET-Quellcode

    1. Private Sub open()
    2. refreshData(dts.Standort) : Formöffnen
    3. End Sub
    4. Private Sub refreshData(dt As DataTable)
    5. ClearRecursive(dt)
    6. FillRecursive(dt)
    7. End Sub
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Wäre also super wenn du hier eine Lösung dazu hättest. ClearRecursive gibt es ja schon, ich brauche also noch ein FillRecursive
    Die Analogie passt nicht ganz, denn ClearRecursive löscht untergeordnete Datensätze - du willst aber übergeordnete (Tabellen) Reloaden.
    Nee - sowas hab ich noch nicht.
    Und ist richtig - das muss auch rekursiv ermittelt werden, welches die übergeordneten Tabellen einer Tabelle sind.

    Aber dassis auch recht gruselig, weil wenn du alle übergeordneten Reloadest, dann musst du dafür alle deren untergeordneten Tabellen löschen - mithin wohl ungefähr das komplette Dataset.

    ErfinderDesRades schrieb:

    dann musst du dafür alle deren untergeordneten Tabellen löschen - mithin wohl ungefähr das komplette Dataset.

    simmt, soweit hab' ich nicht gedacht - dann kann ich ja auch gleich das ganze DTS reloaden. OK dann müssen die Leute damit
    leben dass es erstmal länger dauert beim Öffnen von Programmteilen.

    Dann zum nächsten Problem: ;)


    hier benenne ich einen Standort um - wird sich also auf einige untergeordnete Einträge in diversen Tabellen auswirken.
    Trotz der Meldung werden alle zusammenhängenden Datensätze aber korrekt geändert. Warum dann die Meldung?

    LG
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Da alles nun läuft, dacht' ich mir bevor es hier langweilig wird komm ich ma mit dem nächsten Dingen :D

    seit Umstellung auf DB wird mir nicht mehr "0", sondern "0,0000" bei Decimal-Feldern angezeigt.
    In der Datenbank musste ich die Feldeinstellung auf "Währung" setzen damit meine Werte überhaupt übertragen wurden


    Was kann ich tun, damit's wieder schöner aussieht? Dezimalstellenanzeige in der DB auf 2 ändern bringt leider nix
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    musste mal überprüfen, was für Werte aus der DB eingelesen werden.
    Dem Aussehen nach könnten das sehr sehr kleine Werte sein, aber eben nicht 0.
    Kann man sicher am Binding fixen - da kann man irgendwie einen Format-String angeben (grad vergessen wie).

    (Aber scheint eh buggy zu sein, wie Access da mit Fliesskommazahlen umgeht - das war ja schon ein kranker Workaround, überhaupt von Decimal auf Currency umzusteigen)
    Spoiler anzeigen

    ErfinderDesRades schrieb:

    Dem Aussehen nach könnten das sehr sehr kleine Werte sein, aber eben nicht 0.

    Doch, die Werte sind 0 - das weiß ich weil ich dem DGV ja gesagt hab': blende alles was 0 als Value hat aus. ;)

    Vielleicht muss ich mir da noch'n Textboxbehaviour bauen (dctb = DecimalTextbox) hab ich ja schon, da kann ich sowas bestimmt mit abfangen. muss ich ma testen nachher

    Edit: Jo, das war's doch schon gewesen -> Zeile 5 ^^

    VB.NET-Quellcode

    1. Public Sub RegisterDecimalInput(ParamArray decimalTextBoxes As TextBox())
    2. For Each dctb In decimalTextBoxes
    3. AddHandler dctb.KeyDown, AddressOf dctb_KeyDown
    4. AddHandler dctb.Enter, AddressOf dctb_Enter
    5. If dctb.Text = "0,0000" Then dctb.Text = "0"
    6. Next
    7. End Sub


    Edit2: Oder auch nicht - auf ner anderen Form tut's das nicht, da sind die Textboxen in nem Tabcontrol auf der 2. Seite - die akualisiert er scheinbar nicht.
    Schade


    Lag' daran, dass in der DB "Currency" eingstellt war. Habe nun auf "Double" geändert, weil ich nur 2 nachkommastellen brauche - nu läufts

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tragl“ ()

    Neu

    ErfinderDesRades schrieb:

    vermutlich führt die DB eine ChildRow-Umbenennung aus.

    Ich hätt' da die nächste Parallelitätsverletzung, trotz deiner neuen OleDbPersistance..... ;(
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: