Veröffentlicht Montag um 11:003 Tage Hallo Liebe Community, Ich arbeite aktuell an einer E-Book Aufgabe.. nen Projekt mit SQLite in Visual Studio 2022 und taste mich gerade in das Zusammenspiel zwischen Datenbank und WinForms-Oberfläche heran. Ziel des Projekts ist eine kleine Projektverwaltung für eine Firma, in der Mitarbeiter, Kunden und Projekte verwaltet werden können. Das Projekt habe ich „ProjektverwaltungDB“ genannt.Die Anwendung basiert auf einer klassischen Windows-Forms-App (.NET Framework). In der Program.cs befindet sich die Standard-Main-Methode, die meine Form1 startet. In Form1.cs habe ich die komplette Logik für die Mitarbeiterverwaltung eingebaut. Dort wird beim Start der Anwendung automatisch eine SQLite-Datenbank (projektverwaltung.db) erstellt. Die Tabellen für Mitarbeiter, Kunden, Projekte, Zuordnungen und Arbeitsstunden werden angelegt, falls sie noch nicht existieren.Die Oberfläche (Form1.Designer.cs) habe ich ebenfalls angepasst: Es gibt eine ListBox, die die Mitarbeiter anzeigt, sowie zwei TextBoxen zur Eingabe von Vor- und Nachname und einen Button, um einen Mitarbeiter hinzuzufügen. Da .NET Framework kein PlaceholderText unterstützt, habe ich stattdessen eine eigene Lösung über GotFocus und LostFocus programmiert, sodass die TextBoxen trotzdem eine Art Wasserzeichen anzeigen.Damit SQLite überhaupt funktioniert, habe ich das NuGet-Paket System.Data.SQLite installiert. Dadurch stehen mir die Typen SQLiteConnection, SQLiteCommand und SQLiteDataReader zur Verfügung, die ich auch erfolgreich in meinem Code verwende. Der Code kompiliert fehlerfrei, es gibt keine roten Markierungen oder Build-Fehler – weder in Program.cs, Form1.cs noch im Designer. Mhhh im Debug-Modus in Visual Studio funktioniert die Anwendung soweit... Die Oberfläche wird korrekt angezeigt, die Controls sind klickbar, und ich kann Mitarbeiter hinzufügen. Das Verhalten entspricht also dem, was ich erwarte.Das eigentliche Problem zeigt sich erst, wenn ich das Projekt als .exe speichere bzw. starte. Bei allen bisherigen Projekten ohne SQLite hat das problemlos funktioniert... die .exe ließ sich ausführen, und die WinForms-Oberfläche öffnete sich sofort. In diesem Projekt jedoch passiert nach einem Doppelklick auf die .exe nichts (sichtbar) es läd immer kurz. Es kommt weder eine Fehlermeldung noch eine Exception. Das Einzige, was neu ist, ist die Integration von SQLite.Der Pfad beim Speichern der .exe ist derselbe wie bei meinen bisherigen Projekten, die alle problemlos funktioniert haben, daher glaube ich nicht, dass es daran liegt. Ich habe unten, 3 Bilder angehängt für die Veranschaulichung von: E-Book AufgabeÜbersicht MappeInstallation Da ich das erste Mal mit SQLite über Visual Studio 2022 arbeite, bin ich mir unsicher, ob ich beim Einrichten der Datenbank oder beim Speichern der Anwendung als .exe noch einen Schritt übersehen habe. Ich würde mich wirklich sehr über Informationen oder Hilfestellungen freuen. <3
Montag um 12:313 Tage Debugger Breakpoint so früh wie möglich und dann unter dem Debugger starten.Außerdem mal auf den Debugger Output schauen, eventuell steht da was.
Montag um 20:073 Tage Ändert sich der relative Pfad der sqlite Datei vielleicht? Wodurch er die nicht mehr findet und abstürzt?
Dienstag um 04:342 Tage Stürzt die Anwendung auch ab, wenn du die Anwendung über Visual Studio startest?Wenn ja, dann würde ich mal alle Exceptions aktivieren (Debuggen -> Fenster -> Ausnahmeeinstellungen) und dann die Anwendung starten.Unter WinForms werden nämlich einige Exceptions "geschluckt", die dann eben nicht sichtbar werden. Die Bilder haben aber keinerlei Relevanz, weil sie deinen Code nicht zeigen und wir daher nicht sehen können, was da passiert.
Dienstag um 05:332 Tage Wie so immer bei der Suche nach Fehlern, ist es wichtig, dass man auch Fehler replizieren kann.Man könnte mal probieren, eine virtuelle Maschine zu installieren und schauen, wie es sich verhält, wenn man alle Schritte wiederholt und insbesondere, ob sich der Fehler auch replizieren lässt. (Manchmal sind es ja Kleinigkeiten, wie z.B. Pfade, Datenbankverbindungen etc.).Das ist zwar mit einem gewissen Aufwand verbunden, zeit aber in der Praxis, wie wichtig es sein kann, Test- Produktiv- und Entwicklungssystem gleichzeitig zu pflegen und immer schön Sicherungspunkte zu erstellen, falls sich Systemkonfigurationen bewusst- oder unbewusst verändern.Du könntest versuchen auch von Deinem System einen Wiederherstellungspunkt zurück zu holen (falls es einen gibt, der vor der Installation der DEV Umgebung liegt) und nochmals versuchen, die DEV Umgebung neu einzurichten.Ansonsten mal aus der Entwicklungsumgebung schauen, ob ein Zugriff auf die Datenbank möglich ist oder mal über die Kommandozeile probieren, ob Anmeldung- und Zugriff auf die Datenbank funktionieren. Ich denke, dort könnte irgend etwas im Argen liegen (Pfad, oder User nicht mitgegeben etc.).Wichtig ist es, dass man sich überlegt, wie man schrittweise zum Ziel kommt. Also das Problem in kleinere Abschnitte / Tests zerlegen.Meine Erfahrung ist, dass es in 99.9 % aller Fälle an der Datenbankverbindung liegt. Aber das kann natürlich auch anders gelagert sein.
Dienstag um 06:532 Tage Autor vor 2 Stunden, Whiz-zarD hat gesagt:deinen Codeusing System;using System.Data;using System.Data.SQLite;using System.Drawing;using System.Windows.Forms;namespace ProjektverwaltungDB{ public partial class Form1 : Form { private SQLiteConnection conn; public Form1() { InitializeComponent(); InitializeDatabase(); InitializePlaceholders(); // Wassermarke LoadData(); } private void InitializeDatabase() { try { conn = new SQLiteConnection("Data Source=projektverwaltung.db;Version=3;"); conn.Open(); string sqlMitarbeiter = @"CREATE TABLE IF NOT EXISTS Mitarbeiter( Personalnummer INTEGER PRIMARY KEY AUTOINCREMENT, Vorname TEXT, Nachname TEXT);"; string sqlKunde = @"CREATE TABLE IF NOT EXISTS Kunde( KundenID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Ort TEXT);"; string sqlProjekt = @"CREATE TABLE IF NOT EXISTS Projekt( ProjektID INTEGER PRIMARY KEY AUTOINCREMENT, Bezeichnung TEXT, Projektnummer TEXT, KundenID INTEGER, FOREIGN KEY(KundenID) REFERENCES Kunde(KundenID));"; string sqlMitarbeiterProjekt = @"CREATE TABLE IF NOT EXISTS MitarbeiterProjekt( Personalnummer INTEGER, ProjektID INTEGER, PRIMARY KEY(Personalnummer,ProjektID), FOREIGN KEY(Personalnummer) REFERENCES Mitarbeiter(Personalnummer), FOREIGN KEY(ProjektID) REFERENCES Projekt(ProjektID));"; string sqlArbeitsstunden = @"CREATE TABLE IF NOT EXISTS Arbeitsstunden( ArbeitsstundenID INTEGER PRIMARY KEY AUTOINCREMENT, Personalnummer INTEGER, ProjektID INTEGER, Datum TEXT, Stunden REAL, FOREIGN KEY(Personalnummer) REFERENCES Mitarbeiter(Personalnummer), FOREIGN KEY(ProjektID) REFERENCES Projekt(ProjektID));"; using (SQLiteCommand cmd = new SQLiteCommand(conn)) { cmd.CommandText = sqlMitarbeiter; cmd.ExecuteNonQuery(); cmd.CommandText = sqlKunde; cmd.ExecuteNonQuery(); cmd.CommandText = sqlProjekt; cmd.ExecuteNonQuery(); cmd.CommandText = sqlMitarbeiterProjekt; cmd.ExecuteNonQuery(); cmd.CommandText = sqlArbeitsstunden; cmd.ExecuteNonQuery(); } } catch (Exception ex) { MessageBox.Show("Fehler beim Initialisieren der Datenbank:\n" + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void LoadData() { try { listBoxMitarbeiter.Items.Clear(); using (SQLiteCommand cmd = new SQLiteCommand("SELECT Personalnummer, Vorname, Nachname FROM Mitarbeiter", conn)) using (SQLiteDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { listBoxMitarbeiter.Items.Add($"{reader["Personalnummer"]} - {reader["Vorname"]} {reader["Nachname"]}"); } } } catch (Exception ex) { MessageBox.Show("Fehler beim Laden der Mitarbeiter:\n" + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnAddMitarbeiter_Click(object sender, EventArgs e) { try { string vorname = txtVorname.Text; string nachname = txtNachname.Text; // Prüfen = Wasserzeichen if (vorname == "Vorname") vorname = ""; if (nachname == "Nachname") nachname = ""; if (string.IsNullOrEmpty(vorname) || string.IsNullOrEmpty(nachname)) { MessageBox.Show("Bitte Vor- und Nachname eingeben.", "Warnung", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } using (SQLiteCommand cmd = new SQLiteCommand("INSERT INTO Mitarbeiter(Vorname, Nachname) VALUES(@vorname,@nachname)", conn)) { cmd.Parameters.AddWithValue("@vorname", vorname); cmd.Parameters.AddWithValue("@nachname", nachname); cmd.ExecuteNonQuery(); } LoadData(); ResetPlaceholders(); } catch (Exception ex) { MessageBox.Show("Fehler beim Hinzufügen des Mitarbeiters:\n" + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } } // Wassermarkierung private void InitializePlaceholders() { try { txtVorname.Text = "Vorname"; txtVorname.ForeColor = Color.Gray; txtVorname.GotFocus += RemoveVornamePlaceholder; txtVorname.LostFocus += AddVornamePlaceholder; txtNachname.Text = "Nachname"; txtNachname.ForeColor = Color.Gray; txtNachname.GotFocus += RemoveNachnamePlaceholder; txtNachname.LostFocus += AddNachnamePlaceholder; } catch (Exception ex) { MessageBox.Show("Fehler beim Initialisieren der Platzhalter:\n" + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void RemoveVornamePlaceholder(object sender, EventArgs e) { if (txtVorname.Text == "Vorname") { txtVorname.Text = ""; txtVorname.ForeColor = Color.Black; } } private void AddVornamePlaceholder(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(txtVorname.Text)) { txtVorname.Text = "Vorname"; txtVorname.ForeColor = Color.Gray; } } private void RemoveNachnamePlaceholder(object sender, EventArgs e) { if (txtNachname.Text == "Nachname") { txtNachname.Text = ""; txtNachname.ForeColor = Color.Black; } } private void AddNachnamePlaceholder(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(txtNachname.Text)) { txtNachname.Text = "Nachname"; txtNachname.ForeColor = Color.Gray; } } private void ResetPlaceholders() { txtVorname.Text = "Vorname"; txtVorname.ForeColor = Color.Gray; txtNachname.Text = "Nachname"; txtNachname.ForeColor = Color.Gray; } }}
Dienstag um 06:542 Tage Autor vor 18 Stunden, ExplainItToTheDuck hat gesagt:Debugger Breakpoint so früh wie möglich und dann unter dem Debugger starten.Außerdem mal auf den Debugger Output schauen, eventuell steht da was.Ja, Breakpoint habe ich gestern das erste mal kennengelernt.. ich werde es mal versuchen.
Dienstag um 06:562 Tage Autor vor 2 Stunden, Whiz-zarD hat gesagt:Stürzt die Anwendung auch ab, wenn du die Anwendung über Visual Studio startest?Nein. sie lädt normal und funktioniert.. eben wie gesagt nur in VS.. aber nicht außerhalb.. mit der Datenbank.
Dienstag um 20:142 Tage Ich kann mich beim Nutzen des Debuggers nur anschließen, das ist auf jeden Fall sinnvoll. Es ist ja möglich, dass es doch irgendwo aussteigt und ein auftauchender Fehler "verschluckt" wird, weil die Fehlerbehandlung nicht optimal ist. (Ich hab den Quellcode jetzt nicht gelesen.)Aber... Ich habe in den letzten Jahren leider zunehmend den Eindruck von VS gewinnen müssen, dass es leider ab und an (warum auch immer) nicht so stabil läuft, wie es laufen sollte. Solltest du ein ähnliches Gefühl haben, dann könntest du mal die "Projektmappe bereinigen" lassen. Wenn das nicht "zieht", dann traue dich, im Entwicklungsverzeichnis mal das "bin" und das "obj" Verzeichnis zu löschen. (Diese werden beim nächsten Erstellen wieder neu erstellt.) Wenn das Problem mit der Laufzeitumgebung von VS zusammengehangen hat, sollte es i.d.R. dann wieder funktionieren.
Mittwoch um 15:471 Tag Eventuell mal das ganze Projekt als eine .zip hier hochladen damit andere das nachstellen können?Der Code im Beitrag ist eher kompliziert in ein Projekt zu bringen.
Mittwoch um 20:521 Tag Hast du mal geschaut ob die SQLite DB mit im ausgabeverzeichniss liegt. Ist eine Einstellung damit VS die Datei mit compiliert bzw ausliefert.
vor 19 Stunden19 h Am 29.9.2025 um 13:00, LunyXr3 hat gesagt:Das eigentliche Problem zeigt sich erst, wenn ich das Projekt als .exe speichere bzw. starte.Ich hab das Projekt mal nachgebaut und den Code benutzt. Bei mir funktioniert es. Inwiefern meinst du, dass du das Projekt als .exe speicherst? Beim Kompilieren wird ja schon eine .exe erstellt. Führst du noch das dotnet publish Kommando in der Kommandozeile aus, oder was genau meinst du?
vor 10 Stunden10 h Autor vor 8 Stunden, Whiz-zarD hat gesagt:Ich hab das Projekt mal nachgebaut und den Code benutzt. Bei mir funktioniert es. Inwiefern meinst du, dass du das Projekt als .exe speicherst? Beim Kompilieren wird ja schon eine .exe erstellt. Führst du noch das dotnet publish Kommando in der Kommandozeile aus, oder was genau meinst du?Ich hab gemerkt, dass ich nicht wusste, dass immer direkt exe erstellt wird ich bin in manchen Sachen noch Anfängerin... und hab dann im Release und im Debugg immer exe noch extra erstellt.... haha ....Am 30.9.2025 um 22:14, R1I9C8H5I hat gesagt:Ich habe in den letzten Jahren leider zunehmend den Eindruck von VS gewinnen müssen, dass es leider ab und an (warum auch immer) nicht so stabil läuft, wie es laufen sollte. Solltest du ein ähnliches Gefühl haben, dann könntest du mal die "Projektmappe bereinigen" lassen.Dankeschön, dass werde ich mal probieren.vor 17 Stunden, Chrishh85 hat gesagt:Hast du mal geschaut ob die SQLite DB mit im ausgabeverzeichniss liegt. Ist eine Einstellung damit VS die Datei mit compiliert bzw ausliefert.nein, habe ich noch nicht, danke für die Idee. :))vor 8 Stunden, Whiz-zarD hat gesagt:Ich hab das Projekt mal nachgebaut und den Code benutzt. Bei mir funktioniert es.Ich glaube einfach, dass ich das falsche SQLite benutzt habe.... oben anstatt das normale.. Bearbeitet vor 10 Stunden10 h von LunyXr3
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.