Laden...

Visual Studio lokale Datenbank Daten werden nach jedem Insert gelöscht

Erstellt von S4ndwichmaker vor 2 Jahren Letzter Beitrag vor einem Jahr 733 Views
S
S4ndwichmaker Themenstarter:in
3 Beiträge seit 2022
vor 2 Jahren
Visual Studio lokale Datenbank Daten werden nach jedem Insert gelöscht

Verwendetes Datenbanksystem: <MSSQL>
Hallo liebe myCSharp Community,

da ich noch neu in diesem Forum bin, weiß ich gerade leider nicht in welches "Unterforum" meine Frage passt ich hoffe es ist hier richtig.
Nun zum Problem:

Ich habe in meinem C# Projekt eine lokale Datenbank erstellt, diese soll dann mittels TextBoxen befüllt werden. Ich kann darauf zugreifen die Datenbank auslesen usw.
funktioniert alles wunderbar, aber sobald man einen "INSERT INTO" über SQLCOMMANDS also C# Code ausführt werden alle Einträge in der Datenbank gelöscht und nur der aktuelle eingetragen gespeichert. Logischerweise kann ich somit nur 1 einzigen Eintrag speichern, was ja absolut keinen Sinn macht. Führt man den selben SQL Befehl über eine SQL Abfrage aus
werden die Daten ganz normal untereinander gespeichert und nichts gelöscht.

Mein aktueller C# Code sieht so aus:


string con = Properties.Settings.Default.KonfigurationenConnectionString;
void db_eintragen()
        {
            string command = "INSERT INTO [dbo].[Table] ([Name], [Beschreibung], [Hostname], [IP-Adresse], [Standort], [Betriebssystem], [Version], [ServicePack]) VALUES('" + 
             textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" +
             textBox4.Text + "', '" + textBox5.Text + "', '" + textBox6.Text + "', '" + textBox7.Text + "', '" + textBox8.Text + "')";
            SqlConnection connection = new SqlConnection(con);
            connection.Open();
            SqlCommand command1 = new SqlCommand(command, connection);
            command1.ExecuteNonQuery();
            connection.Close();

        }

Ich weiß nicht ob ich was übersehe aber auch die Google Ergebnisse liefern mir keine Lösungen bzw. weiß ich auch absolut nicht an welcher stelle ich gucken soll liegt es an der lokalen Datenbank ? Habe ich was vergessen im Code ? oder fehlt noch etwas beim SQL Befehl ?
Ich hoffe ich könnt mir helfen, denn ich komme gerade irgendwie absolut nicht weiter.

Schon mal vielen dank.

2.079 Beiträge seit 2012
vor 2 Jahren

weiß ich gerade leider nicht in welches "Unterforum" meine Frage passt ich hoffe es ist hier richtig.

Ich finde deine Wahl richtig.

Dein Code dagegen aber nicht ... 😉

Ein paar generelle Kritikpunkte:* Halte bitte Namenskonventionen ein, z.B. "InsertEntry" anstatt "db_eintragen" oder "nameTextBox" anstatt "textBox1", oder "[Configurations]" anstatt "[Table]"

  • Nutze SQL-Parameter! Wo auch immer das manuelle Zusammenstückeln von SQL noch empfohlen wird - die sollte man steinigen.
  • Alles, was IDisposable (bei dir: SqlConnection und SqlCommand) implementiert, sollte in einem using-Block stehen.
  • Bist Du sicher, dass Du ohne Transaktion arbeiten willst?

Und dein Problem:
Ein simples INSERT löscht keine Daten, das Problem liegt also nicht im gezeigten Code.
Was passiert denn vorher? Wird die DB vielleicht immer überschrieben? Wird sie woanders gelöscht?
Irgendwas passiert vor dem Insert, dass deine Datenbank alle Daten verliert.

Z.B. hatte ich vor Ewigkeiten Mal bei jemanden den Fall gesehen, dass die DB-Datei (bei Sqlite) im Projekt lag und mit ins Zielverzeichnis kopiert wurde - wo sie natürlich immer und immer wieder überschrieben wurde.

By the way:
Mit dem Entity Framework nimmst Du dir den Großteil der Arbeit ab.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

16.835 Beiträge seit 2008
vor 2 Jahren

[Artikelserie] SQL: Parameter von Befehlen
.. und überleg Dir, ob die Spaltennamen wirklich so ne gute Idee ist, vor allem die Sonderzeichen.

Und ja, für mich hört sich das auch eher so an, dass Du Deine Datenbank-Datei beim Build überschreibst.

S
S4ndwichmaker Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Hallo,
tut mir leid das ich mich so lange nicht mehr gemeldet habe.
Ich habe eure Tipps befolgt und den Code angepasst wie beschrieben, leider behebt das nicht den Fehler deswegen wirst du (Abt) denke ich mal recht haben das die Datenbank-Datei immer überschrieben wird. Die Frage ist jetzt wie und vor allen wo stellt man das um ?

MfG

16.835 Beiträge seit 2008
vor einem Jahr

Jede Datei als Teil des Projekts kann konfiguriert werden: https://docs.microsoft.com/de-de/visualstudio/msbuild/common-msbuild-project-items?view=vs-2022#compile
Der relevante Parameter hier ist CopyToOutputDirectory, der per default always ist und somit überschreibt.

Das kann man entweder über die Eigenschaften in Visual Studio ändern (Solution Explorer die Datei markieren -> Rechtsklick -> Properties -> Und dann gibts da irgendwo die Settings) oder man editiert die csproj-Datei von Hand.


    <ItemGroup>
        <Content Update="Pfad zur Datei hier">
            <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        </Content>
    </ItemGroup>

S
S4ndwichmaker Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Super !!!! Genau das war es. So Simpel und es hat mich so viel Zeit gekostet, da man auch nirgendwo etwas dazu steht.
Ich danke dir !

MfG

16.835 Beiträge seit 2008
vor einem Jahr

Eigentlich steht exakt das in der Doku - und ist auch Teil des .NET Tutorials von Microsoft.
Man muss das halt auch durch machen 🙂