none
C# - Windows Form App - Datensatz in Tabelle schreiben

    Frage

  • Hallo,

    habe mit hilfe von Youtube eine kleine Datenbank Anwendung in einem Windows Forms Projekt geschrieben.

    Es ist eine kleine CD Datenbank (Album, Interpret, Jahr usw.

    Bei START habe ich gesagt, er soll mir alles in jeweils List Boxen anzeigen lassen.

    mit "Hinzufügen" füge ich nun einen neuen Datensatz (aus einer TextBox) in die Spalte "Album".

    Allerdings möchte ich noch mit einer weiteren TextBox einen Datensatz in die Spalte "Interpret" (neben "Album") schreiben?

    wenn ich nun den string 

    sql_Text = "INSERT INTO table1 ([Album]) VALUES('" + sNeuer_Wert + "')";

    einfach kopiere und 2 neue Variablen erstelle

    (string sql_Text2 = "INSERT INTO table1 ([Album]) VALUES('" + sNeuer_Wert2+ "')";

    Fügt er die neuen Daten versetzt in die Tabelle?

    mein  Code sieht so aus:

     private void Media_DB_Load(object sender, EventArgs e) //Form LOAD Event
            {
                liste_laden(); // Funktion zum Form Load Even
                // (die liste_laden Funktion wird unten in der private void Anweisung genauer Beschrieben, was der Rechner zu machen hat)
            }
    
            private void liste_laden()
            {
                 //erstelle einen Connection String (lokal) zu der Datenbank und weise sie den deklarierten "string" cn_string zu
                string cn_string = Properties.Settings.Default.Media_DBConnectionString; 
                //Properties=Eigenschaften.Einstellung.Standard.[der Datenbank Connection String der beim erstellen der DB zugewisen wurde)
    
                //erstelle eine Verbindung (lokal - in dem void)
                SqlConnection cn = new SqlConnection(cn_string); //cn_string definiert die Variable die zuvor deklariert wurde (zum Connection String der DB)
                //<- cn heisst connection ; "SqlConnection" ist einfach der Befehl der SQL DB
    
                //hole ALLES (*) die Daten aus deiner "Table1" (Name der Tabelle)
                string Sql_Text = "SELECT * FROM Table1"; //Sql_Text ist wieder die Variable die mit String deklariert wird
                
                //man braucht einen Adapter (Schnittstelle) der eine Data Table lädt
                SqlDataAdapter sql_adapt = new SqlDataAdapter(Sql_Text, cn); //hole alle Felder aus der Tabelle (die Variable sql_text) mit dieser Connection (cn)
                //sql_adapt ist wieder die deklarierte Variable
    
                //Erstelle mir eine neue Tabelle (Blanko) in den Arbeitsspeicher
                DataTable tblData = new DataTable(); //tblData ist wieder die Variable
    
                //Fülle mit den Adapter Variable "sql_adapt" alle Sachen in die "tblData" (im RAM)
                sql_adapt.Fill(tblData);
    
                //Anzeigen der Daten in tblData
                listBox1.DisplayMember = "Album"; //in "" die Spalte die angezeigt werden soll
                listBox1.ValueMember = "[cd_id]"; //Wert den ich habe ist die cd_id
                listBox2.DisplayMember = "Interpret"; //in "" die Spalte die angezeigt werden soll
                listBox2.ValueMember = "[cd_id]"; //Wert den ich habe ist die cd_id
    
                //weise mir die Datenquelle der Tabelle zu
                listBox1.DataSource = tblData;
                listBox2.DataSource = tblData;
    
            } // Funktion zum FORM(Media_DB) LOAD Event
    
            private void button1_Click(object sender, EventArgs e) //<-Button "Hinzufügen"
            {
                eintrag_einfuegen(); //Funktion zum Button (die Funktion wird unten wieder in der Void Anweisung genauer beschrieben)
                textBox1.Clear(); //Leere die Text Box nach dem Einfügen
            }
    
            private void eintrag_einfuegen()
            {
                string sNeuer_Wert = textBox1.Text; //sNeuer_Wert ist auch wieder eine Variable
    
                string sNeuer_Wert2 = textBox3.Text; // das string/int davor bezeichnet nur die Variablen deklaration
    
                string sql_Text = "INSERT INTO table1 ([Album]) VALUES('" + sNeuer_Wert + "')"; //die Variable "Sql_Text" muss in der Void wieder NEU deklariert werden
                //Füge einen Neuen Wert [/VALUES] (Variable "sNeuer_Wert") aus der textBox1 in die Tabelle1 (Spalte[Album]) [< mit eckigen Klammern wird immer die Spalte makiert]    
                
                string sql_Text2 = "INSERT INTO table1 ([Interpret]) VALUES('" + sNeuer_Wert2 + "')"; //TEST
    
                db_execute(sql_Text); //Befehl zur Funktion (die Funktion wird unten wieder in der Void Anweisung genauer beschrieben)
                //wenn wir das ganze ausführen wollen, brauchen wir "db_execute" (db_execute kann auch meinetwegen db_ausfuehren heissen) zum "sql_Text" den wir oben erstellt haben
                db_execute(sql_Text2); //FUNKTIONIERT JA NICHT! aber ich muss ja sql_Text2 ja irgendwie ausgeben?
    
                liste_laden(); //Befehl zur Funktion (die Funktion wurde oben wieder in der Void Anweisung genauer beschrieben)
                //<< Liste wieder ausgeben
    
            } //Funktion zum Button1 "Hinzufügen"
    
            private int db_execute(string sql_TextX) //sql_TextX ist eine völlig neu deklarirte Variable in der Void
            {
    
                //Ausführen von SQL Befehlen wie INSERT, DELETE, UPDATE
                //erstelle wieder eine Connection String (lokal)[wie in liste_laden] zu der Datenbank und weise sie den deklarierten "string" cn_string zu
                string cn_string = Properties.Settings.Default.Media_DBConnectionString;
                //Properties=Eigenschaften.Einstellung.Standard.[der Datenbank Connection String der beim erstellen der DB zugewisen wurde)
    
                //erstelle eine Verbindung (lokal - in dem void) [wie in liste_laden]
                SqlConnection cn = new SqlConnection(cn_string); //cn_string definiert die Variable die zuvor deklariert wurde (zum Connection String der DB) wie in Liste_laden
                //<- cn heisst connection ; "SqlConnection" ist einfach der Befehl der SQL DB
    
                if (cn.State != ConnectionState.Open) cn.Open(); //wenn "cn.State" Ungleich "ConnectionState.Open" dann Führe aus "cn.Open()"
    
                SqlCommand cmd = new SqlCommand(sql_TextX, cn); //??
    
                int intResult = cmd.ExecuteNonQuery(); //der Return wert ob es gut ging oder nicht, dann kommt das Ergebnis mit zurück
                cn.Close(); //??
                return intResult; //gebe den int wert "intResult" aus
    
            } 

    kann mir mal jemand helfen?

    MFG

    Samstag, 13. Januar 2018 18:46

Alle Antworten

  • Hallo derPat18,

    Ich habe gerade Deinen Codeausschnitt erfolgreich ausprobiert. Was heißt, dass es nicht funktioniert, wie Du in den Kommentaren berichtest? Wird eine Fehlermeldung ausgegeben oder es wird kein Datensatz hinzugefügt? Wie sind beide Spalten in der Datenbank definiert? Gibt es Umlaute in den Werten, die Du schreiben möchtest?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    vor 17 Stunden 46 Minuten
    Moderator
  • Hi,

    Du hast zwei INSERT Statements. Es werden also zwei Datensätze erzeugt, die völlig unabhängig voneinander sind.

    Wenn Du beide Werte in einem Datensatz haben willst, musst Du entweder mit einem INSERT arbeiten und beide Spalten und Werte angeben oder ein INSERT und ein UPDATE ausführen.

    INSERT INTO table1
    (
        Album,
        Interpret
    )
    VALUES
    (
        'WertFuerAlbum',
        'WertFuerInterpret'
    )
    

    Du solltest dir aber bitte gar nicht erst angewöhnen, mit Stringverkettung für den Aufbau von SQL Statements zu arbeiten. Damit handelst Du dir neben der unübersichtlichen Schreibweise auch SQL Injection Probleme ein.

    Arbeite mit SqlParametern. Ein Beispiel hierfür findest Du in diesem Thread:

      SQL speichern mit einem SQLbefehl


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    vor 16 Stunden 36 Minuten
    Moderator