Laden...

Aktualisierung Anzeige (WPF) bei Wertänderung in Datenbank(SQLite)

Erstellt von Tutti86 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.119 Views
T
Tutti86 Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren
Aktualisierung Anzeige (WPF) bei Wertänderung in Datenbank(SQLite)

Hallo meine lieben,
dies ist mein erstes Thema hier bei euch. Was vermuten lässt das ich Anfänger bin 😃
Ich hoffe ihr könnt mir verzeihen, wenn die Darstellung oder meine Ausdrucksweise nicht so ganz passt! 😃

Ich möchte gern ein einfaches "Statistik" Fenster erstellen, welches Werte aus einer Datenbank ausliest.

Mein Problem an der Geschichte ist, dass die Werte beim Start der Anwendung ausgelesen und angezeigt werden aber bei Wertänderung in der DB sich im Label nicht ändern.

Hier ist das Textfeld, welches die Änderungen anzeigen soll:


 <Label x:Name="lblPDF_iAnzahlRestanzahlDateien" 
            Content="{Binding Rest}" 
            FontSize="12" 
            RenderTransformOrigin="0.537,0.541"
            HorizontalContentAlignment="Center" 
            VerticalContentAlignment="Center" 
            VerticalAlignment="Center"/>

Hier der C# Code dazu:



using System.Windows;


namespace Rechner
{
    /// <summary>
    /// Interaktionslogik für Statistik.xaml
    /// </summary>
    public partial class Statistik  : Window
    {
       
        public Statistik()
        {
            InitializeComponent();

            LokalDB DBStatistik = new LokalDB();
            this.DataContext = DBStatistik;

        }
        
    }

}

Und hier die Datenbankklasse:

using System;
using System.IO;
using System.Data.SQLite;
using System.ComponentModel;

namespace Steuerrechner
{
    public class LokalDB : INotifyPropertyChanged
    {
        //Events
        public event PropertyChangedEventHandler PropertyChanged;

        //Eigenschaften
        public int Gesamt
        {
            get
            {
                return LeseStatistikWertAusDB("Gesamt");
            }
            set
            {
                SchreibeStatistikWertInDB("Gesamt", value);
                OnPropertyChanged("Gesamt");
            }
        }

        public int Rest
        {
            get
            {
               
                return LeseStatistikWertAusDB("Rest");
            }
            set
            {
                SchreibeStatistikWertInDB("Rest", value);
                OnPropertyChanged("Rest");
            }
        }

        public int Erfolgreich
        {

            get { return LeseStatistikWertAusDB("Erfolgreich"); }
            set { SchreibeStatistikWertInDB("Rest", value); }
        }

        public int Doppelt
        {

            get { return LeseStatistikWertAusDB("Doppelt"); }
            set { SchreibeStatistikWertInDB("Doppelt", value); }
        }

        public int Fehler
        {

            get { return LeseStatistikWertAusDB("Fehler"); }
            set { SchreibeStatistikWertInDB("Fehler", value); }
        }

        public int Gelöscht
        {

            get { return LeseStatistikWertAusDB("Gelöscht"); }
            set { SchreibeStatistikWertInDB("Gelöscht", value); }
        }

        
        static SQLiteConnection SQLconnection = new SQLiteConnection();
        static SQLiteCommand SQLCommand = new SQLiteCommand();

        
        public void Initialisierung()
        {

            #region Verbindung aufbauen

            
            string databaseFile = AppDomain.CurrentDomain.BaseDirectory + @"\_data\" + GlobaleVariablen.GBsNameDatenbank;
            string connectionString = "Data Source=" + databaseFile + ";Version=3;";

            if (!File.Exists(databaseFile))
            {
                // Datenbank erstellen, fals noch nicht vorhanden
                SQLiteConnection.CreateFile(databaseFile);
            }


            SQLconnection.ConnectionString = connectionString;
            SQLconnection.Open();

            #endregion

            #region Initialisierung Tabellen

            SQLCommand.Connection = SQLconnection;

            try
            {

                SQLCommand.CommandText = @"CREATE TABLE SteuerrechnerStatistik (id INTEGER PRIMARY KEY, Bezeichnung STRING, Wert INT)";
                SQLCommand.ExecuteNonQuery();

                SQLCommand.CommandText = "INSERT INTO SteuerrechnerStatistik(Bezeichnung,Wert) VALUES(@Bezeichnung, @Wert)";

                SQLCommand.Parameters.AddWithValue("@Bezeichnung", "Gesamt");
                SQLCommand.Parameters.AddWithValue("@Wert", 0);
                SQLCommand.Prepare();
                SQLCommand.ExecuteNonQuery();

                SQLCommand.Parameters.AddWithValue("@Bezeichnung", "Rest");
                SQLCommand.Parameters.AddWithValue("@Wert", 0);
                SQLCommand.Prepare();
                SQLCommand.ExecuteNonQuery();

                SQLCommand.Parameters.AddWithValue("@Bezeichnung", "Erfolgreich");
                SQLCommand.Parameters.AddWithValue("@Wert", 0);
                SQLCommand.Prepare();
                SQLCommand.ExecuteNonQuery();

                SQLCommand.Parameters.AddWithValue("@Bezeichnung", "Doppelt");
                SQLCommand.Parameters.AddWithValue("@Wert", 0);
                SQLCommand.Prepare();
                SQLCommand.ExecuteNonQuery();

                SQLCommand.Parameters.AddWithValue("@Bezeichnung", "Fehler");
                SQLCommand.Parameters.AddWithValue("@Wert", 0);
                SQLCommand.Prepare();
                SQLCommand.ExecuteNonQuery();

                SQLCommand.Parameters.AddWithValue("@Bezeichnung", "Gelöscht");
                SQLCommand.Parameters.AddWithValue("@Wert", 0);
                SQLCommand.Prepare();
                SQLCommand.ExecuteNonQuery();

            }
            catch (SQLiteException)
            {

            }

            try
            {

                SQLCommand.CommandText = @"CREATE TABLE SteuerrechnerRechnungsdaten (id INTEGER PRIMARY KEY,Rechnungsname TEXT, Rechnungsdatum TEXT, Brutto DOUBLE, Netto DOUBLE, Mwst DOUBLE, Quicktek TEXT)";
                SQLCommand.ExecuteNonQuery();
            }
            catch (SQLiteException)
            {

            }


            #endregion
            
        }

        public static void SchreibeRechnungsdatenInDatenbank()
        {
            
            
            SQLCommand.CommandText = "INSERT INTO SteuerrechnerRechnungsdaten(Rechnungsname,Rechnungsdatum,Brutto,Netto,Mwst,Quicktek) VALUES(@Rechnungsname, @Rechnungsdatum, @Brutto, @Netto, @Mwst, @Quicktek)";

            SQLCommand.Parameters.AddWithValue("@Rechnungsname", GlobaleVariablen.GBRechnungsname);
            SQLCommand.Parameters.AddWithValue("@Rechnungsdatum", GlobaleVariablen.GBRechnungsmonat);
            SQLCommand.Parameters.AddWithValue("@Brutto", GlobaleVariablen.GBd_Bruttosumme);
            SQLCommand.Parameters.AddWithValue("@Netto", GlobaleVariablen.GBd_Nettosumme);
            SQLCommand.Parameters.AddWithValue("@Mwst", GlobaleVariablen.GBd_Mwst);
            SQLCommand.Parameters.AddWithValue("@Quicktek", GlobaleVariablen.GBsQuicktek);
            SQLCommand.Prepare();

            SQLCommand.ExecuteNonQuery();


        }


        private void SchreibeStatistikWertInDB(string sSpaltenname, int iWert)
        {
            SQLCommand.CommandText = "UPDATE SteuerrechnerStatistik SET Wert = " + iWert + " WHERE Bezeichnung = '" + sSpaltenname + "'";
            SQLCommand.ExecuteNonQuery();
        }
        private int LeseStatistikWertAusDB(string sSpaltenname)
        {
            
            SQLCommand.CommandText = @"SELECT Wert FROM SteuerrechnerStatistik WHERE Bezeichnung = '"+ sSpaltenname + "'";
            SQLCommand.ExecuteNonQuery();
            return Convert.ToInt32(SQLCommand.ExecuteScalar());
            
        }
      
        private void OnPropertyChanged(string property)
        {
            if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }


    }

verwendetes Datenbanksystem: SQLite

16.806 Beiträge seit 2008
vor 4 Jahren

Für Deinen Fall gibt es prinzipiell Hilfsmittel, aber keine eingebauten Automatismus.

Was Du möchtest, das nennt sich State Handling.
Deine Daten in der Anwendung ist der State, und der soll prinzipiell aktualisiert werden, wenn sich die Datenquelle ändert.

WPF hat kein eingebautes State Handling; dafür gibt es aber Reactive Extensions (Reactive WPF – Part 1 – Introduction to Reactive Extensions).
Hier wird über ein Benachrichtugngssystem der State aktualisiert, was sich auch automatisch dann auf das DataBinding auswirkt.

Zusätzlich brauchst Du eine Informationsquelle, wenn sich die Daten in der DB geändert haben.
Das kannst Du ebenfalls über das StateHandling machen, wenn eine Anwendung eine eigene Datenquelle haben.
Sprich: Du fügst den neuen Eintrag über das StateHandling hinzu, und das interne Messaging System benachrichtigt automatisch alle Bindings.
Das passt aber nicht auf Umgebungen, wenn sich mehrere Instanzen zu einer DB verbinden können; würde aber auf Dein SQLite gut passen.

Wenn viele Instanzen der gleichen Anwendung (zB viele Benutzer) die Datenbank zeitgleich verändern kann; dann wirds komplexer.
Das geht dann (unsauber) über SqlDependency oder sauberer über einen dazwischen geschaltenen Service, also eine API:
Die Clients kommunizeren damit nicht direkt mit einer Datenbank, sondern mit dem Service, der dann die Datenbank-Operationen übernimmt.
Bei einer entsprechenden Veränderung kann er dann über einen extra Kanal (zB. WebSockets) alle Clients informieren, dass sich die Datenquelle geändert hat, worauf die Client dann reagieren können.

Ansonsten hat Dein Quellcode grobe Fehler bzgl SQL Commands: [Artikelserie] SQL: Parameter von Befehlen

Du solltest Deinen Code besser strukurieren:
[Artikel] Drei-Schichten-Architektur
[Artikel] MVVM und DataBinding

PS: Wenn Du schon deutschen Quellcode schreiben musst (was auch nicht gerade eine gute Idee ist), lass wenigstens die Umlaute weg 😉
[Artikel] C#: Richtlinien für die Namensvergabe

T
Tutti86 Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

WOW, vielen dank für die schnelle und hoffentlich hilfreiche Antwort 😃

Glaube habe noch ein wenig Hausaufgaben auf.