myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » SQLite (Mehrere User updaten denselben Eintrag - Was passiert?)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

SQLite (Mehrere User updaten denselben Eintrag - Was passiert?)

 
Beiträge zu diesem Thema Autor Datum
 SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Moritz83 11.04.2019 21:57
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Abt 11.04.2019 22:16
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) T-Virus 11.04.2019 22:19
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Abt 11.04.2019 22:23
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Moritz83 11.04.2019 22:38
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Th69 12.04.2019 08:45
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Moritz83 12.04.2019 17:47
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Th69 12.04.2019 18:04
 RE: SQLite (Mehrere User updaten denselben Eintrag - Was passiert?) Moritz83 12.04.2019 18:54

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Moritz83
myCSharp.de-Mitglied

Dabei seit: 27.05.2013
Beiträge: 24


Moritz83 ist offline

SQLite (Mehrere User updaten denselben Eintrag - Was passiert?)

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich habe vor einiger Zeit eine MS Access Lösung für unsere Abteilung erstellt (Zeiterfassung, ganz simples Projektmanagement mit IN / OUT Kennzahlen) und würde diese gerne in C# und SQLite umsetzen. Fange gerade erst wieder an mit C# und bin im Moment am Lesen und ausprobieren.

Momentan habe ich folgendes Beispiel erstellt (das Ganze ist an ein WPF Datagrid angebunden) was auch wunderbar funktioniert.

C#-Code:
using System.Data;
using System.Windows;
using System.Data.SQLite;
using System;

namespace WPF_MySQL_Connection
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public DataTable Dt;
        public MainWindow()
        {
            InitializeComponent();
            string connectionString = "Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Test.db" + ";Version=3;";
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            SQLiteCommand cmd = new SQLiteCommand("select * from Test", connection);
            connection.Open();
            Dt = new DataTable();
            Dt.Load(cmd.ExecuteReader());
            //connection.Close();
            dtGrid.DataContext = Dt;
        }

        public void SaveChanges(object sender, RoutedEventArgs e)
        {
            string connectionString = "Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Test.db" + ";Version=3;";
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            var abc = new SQLiteDataAdapter("select * from Test", connection);
            SQLiteCommandBuilder builder = new SQLiteCommandBuilder(abc);
            abc.UpdateCommand = builder.GetUpdateCommand();
            abc.Update(Dt);

        }
    }
}

Aus der Tabelle "Test" lese ich im Moment den Wert "Name" aus und stelle ihn im Datagrid dar. Wenn ich den nun editiere und via Button (Click Method "SaveChanges") wieder speichere taucht die Änderung im db File auf. Hiezu nun 2 Fragen:

1.) Gehe ich Recht in der Annahme dass wenn ein 2. User zur gleichen Zeit denselben Eintrag ändert das erst eine und danach die andere Änderung vorgenommen wird? (Sprich die Tabelle wird für kurze Zeit gesperrt bis der Updateprozess abgeschlossen ist und dann wird das nächste Update vollzogen)
2.) Es sind mehr oder weniger statische Daten mit sehr wenig Änderungen pro Stunde, wie könnte man ein Update des UI vornehmen? (Gibt es eine Möglichkeit das die SQLite Datei ein "Signal" sendet wenn eine Tabellle geändert wurde so das alle die zu dem Zeitpunkt ein Datagrid der entsprechenden Tabelle sehen ein Update kriegen?) (Hoffe das ist verständlich ausgedrückt unglücklich )

Danke euch im Vorraus!

Gruss
Moritz

PS: Wie gesagt, blutiger Anfänger ... der Code oben ist alles andere als "regelkonform" Augenzwinkern
11.04.2019 21:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.946
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Locking Mechanismen musst Du selbst implementieren; nimmt Dir die Datenbank nicht ab.

Bei Punkt 2 würde man mit Events arbeiten; zB. mit Reactive Extensions.
D.h. wenn Du die Datenbank schreibst, wirfst Du Applikationsintern einen Event.
Das lässt sich super einfach realiseren, wenn Du allgemein Deine Anwendung nach Events auslegst, zB. mit Hilfe von MediatR.

Aber ja, wenn das neu ist, dann muss man sich erst mal einlesen.
Beispiele zu MediatR siehst Du zB. bei mir im GitHub.
 https://github.com/BenjaminAbt/2018-Talk...c/Common.Engine

Und da Du mit WPF arbeitest:  [Artikel] MVVM und DataBinding
Verwendest Du bei WPF kein MVVM, dann wirst Du sehr schnell mit Hacks arbeiten müssen - was unsauber wird.
WPF ist auslegt um mit MVVM zu arbeiten.
11.04.2019 22:16 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.287
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Was du machen willst, wird nicht mit einer Embedded DB wie Sqlite gelöst.
Wenn du eine Zeiterfassung machst, dann nimm einen richten DB Server der die Daten dann zentral lagert.
Sqlite ist nicht dafür gedacht, dass X Benutzer darauf einhauen mit Daten.
Embedded DBs sollten immer als Stand-Alone Datenbanken verwendet werden.

In deinem Fall würde ich eine Web als API aufsetzen gegen das deine Anwendung als Client per WebServices arbeitet.
Das sauber umgesetzt, löst auch viele Probleme wie die Synchronisation der Sqlite Datenbanken und weitere Fehlerquellen.
Zusätzlich verbirgst du damit deine Datenbank vor Einblicken und Manipulation.
Sqlite Datenbanken kann man mit den entsprechenden Tools einfach bearbeiten.

Ebenfalls gehören SQL Anweisungen nicht in die UI.
Siehe Drei-Schichten-Modell für die saubere Trennung von Datenmodell, Datenverarbeitung und der Anwendungslogik.

Auch solltest du das DataTable nicht als Container für deine Daten verwenden.
Bau dir eine entsprechende Klasse die dann deine Daten abbilden und arbeite damit.
DataTable sind schwerfällige und Speicherintensive Konstrukte, wenn möglich immer meiden.

Deinen ConnectionString solltest du auch dann in der App.config bzw. bei einem Web in die Web.config packen.
Sowas gehört nicht hart gecoded.

SqliteConnections solltest du in ein using packen, damit diese automatisch disposed werden.
Im schlimmsten Fall gibst du die Verbindung nicht frei und sperrst dir damit den Zugriff auf deine Datei.

Nachtrag:
Wenn der aktuelle Ansatz nur zum testen und lernen ist, ist es noch okay.
Wenn möglich versuch aber schon einmal diese Puntke aufzunehmen und dir anzuschauen.
Gerade bei größeren Projekten wirst du dich später freuen wenn dein Code noch wartbar und erweiterbar ist. :)

T-Virus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 11.04.2019 22:20.

11.04.2019 22:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.946
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von T-Virus:
Sqlite ist nicht dafür gedacht, dass X Benutzer darauf einhauen mit Daten.

Doch, Sqlite kann problemlos von mehreren Prozesse, Threads und auch von mehreren Usern zeitgleich verwendet werden - anders als Access.

Zitat von T-Virus:
In deinem Fall würde ich eine Web als API aufsetzen gegen das deine Anwendung als Client per WebServices arbeitet.

In meinen Augen absoluter Overkill.
Es geht hier um eine simple Zeiterfassung wie er bereits schreibt.

Nicht um Zeiterfassung von Mitarbeitern am Stempelautomat.
Aber ja, damit sind natürlich nicht alle technischen Fallstricke gelöst.

Zitat von T-Virus:
Das sauber umgesetzt, löst auch viele Probleme wie die Synchronisation der Sqlite Datenbanken und weitere Fehlerquellen.

Nein, es löst kein Locking Szenario von Einträgen.
11.04.2019 22:23 Beiträge des Benutzers | zu Buddylist hinzufügen
Moritz83
myCSharp.de-Mitglied

Dabei seit: 27.05.2013
Beiträge: 24

Themenstarter Thema begonnen von Moritz83

Moritz83 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Erstmal danke euch Beiden! Vielleicht noch als Info, ich bin kein Informatiker sondern möchte mir C# in "Eigenregie" aneignen um dann diese Kenntnisse bei uns im Büro ev. umsetzen zu können. Wir haben leider keine eigene IT und unsere Geschäftsleitung ist der Meinung das Excel genügt

Wir brauchen mittelfristig def. eine professionelle Lösung (also nicht meine Variante) aber solche Prozesse dauern bei uns Jahre. Da die Access Lösung läuft tu ich dies in erster Linie für Mich und meinen Spieltrieb, sprich so schnell wird da nix in den laufenden Betrieb eingebaut.

@Abt
MVVM steht ganz oben auf meiner ToDo Liste, allerdings übe ich im Moment noch mit den grundlegenden C# Befehlen und wollte da noch ein wenig mehr üben (meine Logik: Wenn ich den Befehl beisammen habe und es funktioniert kann ich es im 2. Schritt entsprechend den MVVM Regeln umsetzen).

Wollte erstmal gucken wie das mit dem Binding funktioniert und der nächste Schritt wäre dann die Umsetzung dieses Miniprojekts mit dem MVVM Pattern. So möchte ich Step-by-Step mein Wissen erweitern.


@T-Virus
Vielleicht zur Erklärung zum Thema "Zeiterfassung":
Wir generieren für jeden Auftrag in unserer Abteilung eine eindeutige Nummer (K + Laufnummer), erfassen diverse Schritte wie "Genehmigungszeichnung, Freigabe oder Änderung" mit jeweils In / Out Datum und zu jedem Schritt werden Arbeitszeiten erfasst (Beispiel: K1500 / Freigabe / 10.04.2019 + 11.04.2019 / 3h) und das wars. Wir reden hier von ca. 3-6 Nummern pro Tag, mehr auf keinen Fall und es arbeiten ca. 15 Leute damit wobei die Chance das 2 Personen denselben Auftrag bearbeiten bei max. 1% liegt.

Das MVVM Pattern ist, wie oben geschrieben, ganz oben auf meiner ToDo Liste, aber ich "kämpfe" im Moment noch mit C# selber (Befehle, Aufbau, etc).

Nehme aber eure Punkte sehr gerne auf und werde mich def. damit in Kürze beschäftigen.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Moritz83 am 11.04.2019 22:39.

11.04.2019 22:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.334
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hier noch der passende Artikel zur Aufteilung von UI, Logik und DAL:  [Artikel] Drei-Schichten-Architektur
12.04.2019 08:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Moritz83
myCSharp.de-Mitglied

Dabei seit: 27.05.2013
Beiträge: 24

Themenstarter Thema begonnen von Moritz83

Moritz83 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für den Link zu den Layern, macht absolut Sinn die Aufteilung!

Habe heute ein wenig gelesen und das Beispiel studiert. Wollte dann mich mit dem Thema "ObservableCollection" befassen, allerdings finde ich dazu in Zusammenhang mit SQLite kaum Beispiele und die meisten lesen die Daten aus SQLite in ein Datatable und wandeln das dann um ... kommt mir seltsam vor diesen Zwischenschritt zu machen! (Oder ist das wirklich die Vorgehensweise?)
Hat jemand hierzu ein "besseres" Beispiel?


Das Thema mit dem "using" bei SQL Verbindungen und das verwalten des Connectionstrings habe ich Gott sei Dank etwas besser kapiert.
12.04.2019 17:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.334
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Eine DataTable wird in den meisten Tutorials und Beispielen eher der Einfachheit benutzt (bzw. auch aus Unerfahrenheit ;-), ist aber nicht der beste Weg.

Da wären eher Repository und Unit of Work die passenden Stichworte.

Wenn du jedoch erst einmal eher ein kleines bis mittleres Projekt angehst, dann solltest du auch nicht zu viele Design-Patterns gleichzeitig angehen, sondern nach und nach dich mit den verschiedenen Themen befassen (sonst kann es manchmal eher als "Overengineering" angesehen werden).
12.04.2019 18:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Moritz83
myCSharp.de-Mitglied

Dabei seit: 27.05.2013
Beiträge: 24

Themenstarter Thema begonnen von Moritz83

Moritz83 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

das mit dem Overengineering kenne ich von der Access Lösung her, wollte viel mehr als ich "packen" kann.

Naja dachte mir halt das ich (eben weill die DB mein zentrales Element ist) gleich auf etwas setzen sollte das mehr "wumms" hat. Ich guck mir das Thema Repository mal an, danke dir
12.04.2019 18:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 5 Monate.
Der letzte Beitrag ist älter als 5 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 18.09.2019 13:53