Denkanstoß gesucht für eine Art kleine Versionskontrolle.

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

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von JackSA.

    Denkanstoß gesucht für eine Art kleine Versionskontrolle.

    Hallo das ist mein erster Post hier ich hoffe ich hab die richtige Kategorie erwischt :)

    Ich habe ein Tool geschrieben das auf eine DB Datei zugreift,
    das Tool und die Datei waren bisher auf dem Server im Netzwerk,
    das Problem ist jetzt das die Netzwerk Geschwindigkeit durch einen Umzug so in den Keller ging das ein Arbeiten übers Netzwerk nicht mehr möglich ist.

    Lösung ist das Tool und die Datei lokal zu nutzen was allerdings das nächste Problem aufwirft,
    da dieses Tool von 2 oder mehr Rechnern genutzt werden soll.

    Mein Lösungsansatz war die DB Datei auf dem Server belassen und beim Start des Lokalen Tools die Datei Version prüfen,
    wenn sie von der Lokalen Version abweicht, vom Server auf den Rechner kopieren und beim Daten anfügen oder ändern die Datei auf dem Server updaten.

    Problem es kann sein das 2 oder mehr Personen die Datei bearbeiten und ich deshalb nicht mit einer ID arbeiten kann, Datum ist auch nicht wirklich nutzbar da ja nicht nur Daten angefügt sondern auch geändert / gelöscht werden können.

    Hat jemand eine Idee? ?(
    Hallo JackSA,

    der von dir beschriebene Fall ist eine wirklich interessante Art mit einer DB umzugehen. Da du leider nicht schreibst welche Art DB du verwendest kann ich jetzt nur Orakeln.
    Meines Erachtens wäre die sinnvollste Variante mit SQL Server zu arbeiten und diesen zu synchronisieren. Mit anderen Worten du hast dann einen zentralen Server und deine Software verwendet einen lokalen Server der repliziert wird.
    mfG.
    Stephan
    Hallo @JackSA

    Wenn ich dein Problem richtig verstanden habe würde es für dich völlig ausreichen eine normales ClickOnce anwendung zu erstellen welche eine Datenbank nutzt. (ich empfehle MS SQL-Server am Server)

    JackSA schrieb:

    ein Tool geschrieben das auf eine DB Datei

    Kanst du "DB Datei" bitte genauer ausführen?

    JackSA schrieb:

    Problem es kann sein das 2 oder mehr Personen die Datei bearbeiten und ich deshalb nicht mit einer ID arbeiten kann

    Das ist mit einer Datenbank kein Problem, um konflikte zu vermeiden gibt es ein paar machanissmen.

    Aber da wir deinen Wissensstand nicht kennen will ich jetzt nicht genauer auf Details eingehen, evtl. muss da in mehrere threads aufgeteilt werden. Lass dich aber jetzt nicht entmutigen, hier sind viele fähige Leute unterwegs die dir Helfen können.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Willkommen im Forum.
    So wie es hier beschrieben wird, ist es bei mir auch privat. Ohne echtes DBMS, sondern mit einer Datei und einem (mehr oder weniger ausgeklügelten) Managementprogramm, welches die Clientanfragen verarbeitet. Das Problem aber dürfte schon im Voraus existiert haben: Selbst bei einem hyperschnellen Netzwerk hast Du doch nur eine Datei, auf die mehrere Rechner (direkt oder indirekt) zugreifen. Wie hast Du es denn vor dem Umzug gelöst?
    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.
    Schon mal vielen Dank für die Antworten, ich wollte eigentlich ausführlicher werden aber nachdem ich gefühlt 3 Seiten geschrieben hab dachte ich mir das muss kürzer werden sonst liest es niemand mehr :)

    Ursprünglich war das Tool gedacht um die Adressierung von AS-I Slaves zu automatisieren.
    Das Tool besteht eigentlich aus 3 Teilen,
    ein Editor der die Adressen, Labelbeschriftungen usw..
    aufnimmt und in eine DB Tabelle schreibt sowie die Kennungstabelle ausliest und mit anzeigt.

    Das Kennungstool das die Kennungen der Slaves ausliest und in die Kennungstabelle schreibt.

    Das Frontend das dann letztlich die Adressierung und den Labeldruck übernimmt und seine Daten aus XML Dateien holt die vom Editor erzeugt werden wenn alle Daten eingegeben sind.

    Mit Servern aufsetzen ist das so eine Sache hier, wir haben eine IT und eine Software Abteilung die aber so ausgelastet sind das sie sich nicht um solche Wunschprojekte der Abteilungen kümmern können.

    Deshalb sind wir den einfachen weg einer DB Datei gegangen, wir haben auf dem Server einen SQL Server der für unser ERP System genutzt wird aber selbst unser ERP wird als Remote Anwendung genutzt weil die Netzanbindung in unsere Aussenstelle sehr schwach ist.

    Meinen Wissensstand würde ich eher als begrenzt einschätzen, ich hab 2001 den Fachinformatiker gemacht,
    damals mit einem PHP Projekt und seither nur ab und zu mal eine Webseite oder so kleine Anwendungen,
    mit VB beschäftige ich mich erst seit relativ kurzer Zeit.

    VaporiZed schrieb:

    Willkommen im Forum.
    So wie es hier beschrieben wird, ist es bei mir auch privat. Ohne echtes DBMS, sondern mit einer Datei und einem (mehr oder weniger ausgeklügelten) Managementprogramm, welches die Clientanfragen verarbeitet. Das Problem aber dürfte schon im Voraus existiert haben: Selbst bei einem hyperschnellen Netzwerk hast Du doch nur eine Datei, auf die mehrere Rechner (direkt oder indirekt) zugreifen. Wie hast Du es denn vor dem Umzug gelöst?


    Vor dem Umzug war alles auf dem Server und lief eigentlich recht schnell und stabil. Konnte auch problemlos von mehreren Rechnern gestartet werden.
    @VaporiZed
    Hat er doch geschrieben. Programm und Datenbankdatei auf dem Server. Das ist eher kein Problem ich hatte bei uns in der Firma auch jahrelang ein solches Szenario laufen. Clients Lokal installiert und Access Datenbank auf dem Server Datenzugriff mit ADO. Hat mit bis zu 10 Usern perfekt funktioniert.

    @JackSA
    wenn Server kein Thema sind weil die Zentrale IT zickt könntest du mit einem lokalen Server arbeiten das Replikationsgedönse kannst dir dann sparen. Nachteil ist halt das dieser Rechner immer laufen muss, aber da er nicht viel können muss (eventuell Datensicherung) könntest du sogar einen Raspberry PI mit MySQL nutzen...
    mfG.
    Stephan

    kaifreeman schrieb:


    wenn Server kein Thema sind weil die Zentrale IT zickt könntest du mit einem lokalen Server arbeiten das Replikationsgedönse kannst dir dann sparen. Nachteil ist halt das dieser Rechner immer laufen muss, aber da er nicht viel können muss (eventuell Datensicherung) könntest du sogar einen Raspberry PI mit MySQL nutzen...


    Da wir hier am Standort auch einen Server haben(ich weiß gar nicht was da drauf läuft) war das der ursprüngliche Plan nachdem raus war das die Netzverbindung zu schwach ist.
    Aber auch das möchte die IT nicht. deshalb der Versuch eine Art Versionskontrolle für Die DB Datei zu machen.
    Es ist eine Access Datei mit momentan 4 Tabellen.
    1. ASI_Konfigs
    2. Bauteilkennung
    3. Prüfsummen
    4. Einstellungen
    Tabelle 1-3 sind verknüpft, 4 enthält Einstellungen zu Druckern, DB Pfad usw.. die für alle nutzenden Rechner gleich sind.

    Ich habe ein Bild angehängt von den Tabellen Verknüpfungen, alles recht einfach gehalten.
    Bilder
    • ASI_DB.jpg

      67,71 kB, 524×348, 72 mal angesehen

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

    Das Dazenmodell ist wirklich nicht aufwändig.

    Ich könnte mir folgende Lösungen für dein Problem vorstellen:
    1. Dein Büro hat sicher einen Fileserver im Intranet. Nutze diesen für die DB und baue die Software auf Lokal um.
    2. Cache die Daten der DB beim Laden in eine lokale DB und spiele beim Bbenden der Applikation zurück

    Um ehrlich zu sein kommt es mir dennoch seltsam vor das du Probleme mit der Performance hast. Ich nehme an die Datei liegt auf einem Fileserver, wenn dieser so schlecht angebunden ist müsste doch das komplette Büro jammern.

    Vielleicht eines noch am Rande Access unterstützt externe Tabellenverknüpfung so könntest du zumindest dein ID Problem lösen.
    mfG.
    Stephan
    So wie unter 1 und 2 beschrieben war der Plan.
    vor dem Umzug waren alle Werke an einem Standort wenige hundert Meter von einander getrennt und wurde mit Kabel / Richtfunk zwischen den Werken verbunden, der momentane Ausweichstandort ist einige Kilometer entfernt und wird über öffentliche Leitung (Telekom) angebunden, die Verbindung ist aber Technisch bedingt (alte Kupferleitung) sehr langsam und ja alle hier haben Geschwindigkeitsprobleme weswegen unsere Client Anwendungen auch als Remote Anwendungen laufen.

    Mein eigentliches Problem, schade das es beim ersten Post wohl noch nicht richtig rüber kam, wenn Person 1 einen Datensatz zufügt und gleichzeitig Person 2 einen Datensatz löscht dann hab ich auf jedem Client eine andere Version die sich beide von der Hauptversion auf dem Server unterscheiden.
    Dafür brauch ich eine Grund Idee, wie kann ich vorgehen das:
    1. Der editierte Datensatz
    2. Der gelöschte Datensatz
    in der Serverdatei erscheint.
    Dein Problem ist, dass du anscheinend nicht die geeignete Technik einsetzen willst.

    Access als DBMS ist jetzt nicht so der Hit, aber vor die Access-Datei einen Serverdienst mit dem sich die Clients verbinden. Und nur der Dienst liest und schreibt in die Access-Datei.
    Bedingt natürlich dass man sich im Client immer nur die Daten holt, die man auch wirklich braucht und nicht hunderte von Megabyte in dein Dataset liest.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.

    MrTrebron schrieb:

    Dein Problem ist, dass du anscheinend nicht die geeignete Technik einsetzen willst.


    Mein Problem ist nicht das einsetzen wollen sondern dürfen, ich habe im Intranet einen Fileserver, das ist alles was ich an Servern zur Verfügung habe, ich darf und kann Lokal keinen Server starten und im Intranet schon 2 mal nicht ich kann nur mit einer DB Datei arbeiten. was die Größe angeht hat die Datei jetzt ca 500 Kb und etwa 10 % der endgültigen Daten sind bei den Tests schon eingegeben worden also denke ich das die Datei, wenn alle Datensätze aufgenommen sind nicht über ca 5 MB kommt.

    *Vollzitat entfernt* ~NoFear23m

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

    Zum einen könnte die ein SQLite DB-file weiterhelfen zum anderen denke ich aber das der Grund für die schlechte performance hier wo anders zu suchen ist.
    Wenn das sooo schlecht geht - bei gleichzeitig einer sooo kleinen DB liegt es vieleicht an deinem Abruf?

    Zeig uns doch mal deinen Code mit welchem du die Daten abrufst - evtl. ist hier ein kleiner Fehler passiert der dazu führt das es langsam wird weil du vieleicht die Leitung mit daten vollstopfst welche du gar nicht erst benötigst.
    Sehe ich leider immer wieder.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Bevor wir umgezogen sind war das Tool schnell erst mit der langsamen Verbindung klappt es nicht mehr.
    Nicht erschrecken über den Code ich versuche mich in VB.Net einzuarbeiten aber da ich noch anderes zu tun hab komm ich nicht so dazu deshalb ist es eine wilde Mischung aus OO, Imperativ und keine Ahnung was noch :S Aber es funktioniert ;)

    VB.NET-Quellcode

    1. Public Function Laden_Mdb() As ArrayList
    2. 'Verbindung zur Db Datei
    3. Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DB_Pfad & ";User Id=admin;Password=;")
    4. 'Abfrage Query mit der eingegebenen Blechartikelnummer
    5. Dim cmd As New OleDbCommand("SELECT ASI_Konfigs.ID, ASI_Konfigs.Artikelnummer_Blech, ASI_Konfigs.Artikelnummer_ASI, ASI_Konfigs.Lagerplatz, Bauteilkennung.Bauteilkennung, SlaveAdressen.ASIAdr,
    6. ASI_Konfigs.SlaveAdresse, ASI_Konfigs.LabelBeschriftung, ASI_Konfigs.KappenPosition, Prüfsummen.Prüfsumme
    7. FROM (((ASI_Konfigs LEFT OUTER JOIN
    8. Bauteilkennung ON ASI_Konfigs.Artikelnummer_ASI = Bauteilkennung.Artikelnummer_ASI) LEFT OUTER JOIN
    9. SlaveAdressen ON ASI_Konfigs.SlaveAdresse = SlaveAdressen.SlaveAdr) LEFT OUTER JOIN
    10. Prüfsummen ON ASI_Konfigs.Artikelnummer_Blech = Prüfsummen.Geräteblechnummer)
    11. WHERE ASI_Konfigs.Artikelnummer_Blech = " & gbnr & " ", conn)
    12. 'Neuer Datenadapter da
    13. Dim da As New OleDbDataAdapter(cmd)
    14. 'Neue Tabelle dt
    15. Dim dt As New DataTable("ASI")
    16. 'Verbindung öffnen
    17. conn.Open()
    18. 'Funktion fill des Datenadapters da auf die Tabelle dt anwenden
    19. da.Fill(dt)
    20. 'Verbindung schließen
    21. conn.Close()
    22. 'Neuen Datenview dv
    23. dv = New DataView(dt) ' oder dv = dt.DefaultView;
    24. 'Datagridview die Datensource dv zuweissen
    25. DataGridView1.DataSource = dv
    26. 'Den Spalten, den modus Fill zuweissen
    27. DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
    28. 'Spaltenköpfe umbenennen
    29. DataGridView1.Columns("SlaveAdresse").HeaderText = "SlaveProgAdr"
    30. DataGridView1.Columns("ASIAdr").HeaderText = "SlaveAdresse"
    31. 'Spalten auf unsichtbar ( Visible() = False) setzen
    32. DataGridView1.Columns("Prüfsumme").Visible() = False
    33. DataGridView1.Columns("SlaveAdresse").Visible() = False
    34. 'e als eventhandler ohne inhalt setzen
    35. Dim e As EventArgs = Nothing
    36. 'Die eingegebene Blechartikelnummer in die Globale Variable gbnr übergeben
    37. TxtArtiGb.Text = gbnr
    38. 'Auslösen der Anzeige
    39. MyBase.OnLoad(e)
    40. 'Call Function() Laden_MdbAV() 'Auskommentiert
    41. 'auserkraftsetzen der Warnung
    42. #Disable Warning BC42105 ' Die Funktion gibt nicht für alle Codepfade einen Wert zurück.
    43. 'Globale Variable füllen
    44. SlaveAdrAender = TxtAenderSlaveAdresse.Text
    45. 'If DataGridView1.CurrentRow.Cells(9).Value = "" Then
    46. ' TextBoxPrüfsum.Text = ""
    47. 'Else
    48. TextBoxPrüfsum.Text = DataGridView1.CurrentRow.Cells(9).Value
    49. 'End If
    50. End Function
    Hallo

    Da stellt sich mir doch gleich die Frage - damit wir da mal einen Wert haben an welchen wir uns halten können:

    Wieviele Datensätze kommen hier zurück (ca.)?
    Ich hatte es (früher) schon des öfteren das Access bei mehreren Joins sehr langsam wurde. Google mal danach, kommt ziemlich viel.
    OK, in der alten location ist es gegangen, komisch.

    Ich bin gespannt wieviele Datensätze es sind, evtl. Hilft dir ja schon ein simples Paging.
    Was auch noch interessant wäre - Anzahl der Datensätze in den anderen Tabellen.

    Warum frage ich so doof - ich hatte bis vor kurzem eine Anbindung an eine DB wo ich nur 1MBit upload mit ziemlich hohen Latenzen auch sehr langsam unterwegs war - auch hier musste ich Optimieren. Ich habe damals nur mit den Optimierungen am SQL (ist keine schöne Aufgabe) fast 3/4 der Zeit einsparen können. Evtl. geht das bei dir ja auch. Da wir aber die Daten nicht haben und nicht genau wissen was da wie zurückkommt ist es für uns etwas schwerer.

    Aber es wäre weit weniger Arbeit für dich als alles neu zu machen weil du auf etwas komplett anderes setzt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Datensätze habe ich in den Tabellen:
    ASI_Konfigs = 24
    Bauteilkennung = 9
    Prüfsummen = 6
    SlaveAdressen = 63 (fester wert, ändert sich nicht)


    Habs gerade nochmal geprüft, wenn ich das Tool lokal mit lokaler DB Datei nutze dann dauert es vom anklicken einer Artikelnummer bis zur Anzeige unter 1 Sekunde wenn ich das ganze über den Fileserver mache dauert das starten des Tools schon 10-15 Sekunden und die Anzeige zwischen 10 und 20 Sekunden

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

    Also wie @Nofear23m schon geschrieben hat Joins sind in Access langsam.

    Wenn du die Joins zerlegst dann könnte das die Performance sicher verbessern. Soweit ich dein Select interpretiere holst du dir ja alle Daten in ein View. Du lädst im Select 10 Spalten und zeigst davon 4 an.

    klingt jetzt zwar vielleicht blöd und die Profis haben bessere Ideen aber ich würde den ersten Filter mit nur Select from Artikel abschießen und die weiteren Werte dann im RAM, also sprich im Programm selbst „joinen “ eventuell kannst du mit einer Master Detail View also ein Button der die Details in einer eigenen Form anzeigt weiterarbeiten.
    mfG.
    Stephan
    Hmm ich könnte vielleicht alle Daten einzeln aus den Tabellen abrufen und dann im Programm umständlich die Daten einander zuordnen, dazu muss ich aber immer alle Daten aus allen Tabellen abrufen, da ich schon mehr wie 4 Daten anzuzeigen habe :)
    Bilder
    • Editor.jpg

      438,81 kB, 1.176×887, 58 mal angesehen
    Hallo, klingt nach mehr Aufwand als es im Endeffekt ist. Die Frage die sich hier stellt ist eher muss der Benutzer sofort alle Daten sehen?
    in deinem DG sind viele Infos enthalten einige schauen auch nach „berechneten Zellen“ aus.
    Zb deine Labelbeschriftung. Vielleicht kannst du die eliminieren (sollte es sich um berechnete handeln) also den String im Programm vorbereiten und dann in die Datenbank schieben.

    Dennoch seltsam das die paar Werte so ein Problem machen, ich sehe keine Arrays Blobs oder sonstiges, so eine Datenbankabfrage könnte ein 56k Modem schnell erledigen....

    Aber mal was anderes warum eigentlich das Update und Add mit den unterschiedlichen Forms abbilden dein Datagrid kann das auch...

    ps noch vergessen versuche einfach mal eine normale Select Abfrage und schau was die Performance macht.
    mfG.
    Stephan