Benutzer mit den meisten Antworten
Datenbank fertig! was ist noch falsch?

Frage
-
Hallo,
ich habe eine Artikelliste (mit Datensatz im DataGridView) und kann endlich neue titel hinzufügen:
private void button6_Click(object sender, EventArgs e) // Button "Artikel hinzufügen { eintrag_einfuegen_Artikel(); //Funktion zum Button (die Funktion wird unten wieder in der Void Anweisung genauer beschrieben) textBox_Album.Clear(); //Lösche den Inhalt der Textboxen nach dem hinzufügen textBox_Interpret.Clear(); textBox_Jahr.Clear(); textBox_Genre.Clear(); textBox_Menge.Clear(); textBox_Preis.Clear(); } private void eintrag_einfuegen_Artikel() //Einfügen Funktion/Algorythmus für Button "Artikel hinzufügen" { string sql_Text = "INSERT INTO table_CD (Album, Interpret, Jahr, Genre, Menge, [Preis in EUR]) VALUES('" + textBox_Album.Text + "','" + textBox_Interpret.Text + "','" + textBox_Jahr.Text + "','" + textBox_Genre.Text + "','" + textBox_Menge.Text + "','" + textBox_Preis.Text + "')"; //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] db_execute_Artikel(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); liste_laden_Artikel(); //Befehl zur Funktion (die Funktion wurde oben wieder in der Void Anweisung genauer beschrieben) //<< Liste wieder ausgeben } private int db_execute_Artikel(string sql_TextX) //Ausführen von SQL Befehlen wie INSERT, DELETE, UPDATE für Artikel { //sql_TextX ist eine völlig neu deklarirte Variable in der Void //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.CD_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 } private void liste_laden_Artikel() //Lade den Datensatz in die DataGridView2 Artikel { //erstelle einen Connection String (lokal) zu der Datenbank und weise sie den deklarierten "string" cn_string zu string cn_string = Properties.Settings.Default.CD_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 Table_CD"; //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 //weise mir die Datenquelle der Tabelle zu dataGridView2.DataSource = tblData; //der Such Algorythmus zum Makieren des neuen Artikels (setzt mindestens "Album" vorraus! string entered_Album = textBox_Album.Text; // Variable für Zeichensatz aus TextBox DataGridViewRow Reihe; //Variable des Datagridviews for (int i = 0; i < dataGridView2.Rows.Count; i++) // die Schleife läuft solange, bis i die dataGridView1.Rows.Count { Reihe = dataGridView2.Rows[i]; //wenn die Schleife so oft durchlaufen ist, bis der Tex if (Reihe.Cells[1].Value.ToString().Equals(entered_Album)) //"[1] ist die Spalte Album { //Wenn die Abfrage oben zutrifft... (True) dataGridView2.CurrentCell = Reihe.Cells[1]; //Algorythmus zum automatischen markieren der gesuchten Zeile break; //if anweisung beenden } } }
Funktioniert ja auch alles super!!
Jetzt habe ich ein 2. Dataset zum Aufträge erstellen mit genau dem selben muster (also hinzufügen)
private void button12_Click(object sender, EventArgs e) //Button "Auftrag erstellen" { eintrag_einfuegen_Auftrag(); string sql_Text = "delete from table_CD where Artikelnummer='" + textBox_Auftrag_Artikelnummer.Text + "'"; //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] db_execute_Artikel(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); liste_laden_Artikel(); //Befehl zur Funktion (die Funktion wurde oben wieder in der Void Anweisung genauer beschrieben) //<< Liste wieder ausgeben } private void eintrag_einfuegen_Auftrag() { string sql_Text2 = "INSERT INTO table_Auftrag (Auftragsnummer, Datum, Kunde_Name, Artikelnummer) VALUES('" + textBox_Auftragsnummer.Text + "','" + dateTimePicker_Auftrag.Text + "','" + textBox_Auftrag_Kunde.Text + "','" + textBox_Auftrag_Artikelnummer.Text + "')"; //die Variable "Sql_Text" muss in der Void wieder NEU deklariert werden //Füge einen Neuen Wert [/VALUES] aus den textBoxen in die Tabelle_Auftrag [< mit eckigen Klammern wird immer die Spalte makiert] liste_laden_Auftrag(); //Befehl zur Funktion (die Funktion wurde oben wieder in der Void Anweisung genauer beschrieben) //<< Liste wieder ausgeben db_execute_Auftrag(sql_Text2); //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); } private int db_execute_Auftrag(string sql_TextX) //Ausführen von SQL Befehlen wie INSERT, DELETE, UPDATE für Artikel { //sql_TextX ist eine völlig neu deklarirte Variable in der Void //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.DB_AuftragConnectionString; //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 } private void liste_laden_Auftrag() //Lade den Datensatz in die DataGridView2 Artikel { //erstelle einen Connection String (lokal) zu der Datenbank und weise sie den deklarierten "string" cn_string zu string cn_string = Properties.Settings.Default.DB_AuftragConnectionString; //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_Text2 = "SELECT * FROM Table_Auftrag"; //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_Text2, 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 //weise mir die Datenquelle der Tabelle zu dataGridView3.DataSource = tblData;
Ergebnis: der 1. Datensatz wird sofort hinzugefügt und ausgegeben (wie es sein soll)
der 2. Code für die Aufträge ist theoretisch das selbe und soll theoretisch dasselbe machen, allerdings macht derrRechner es erst nach dem 2. Button Klick.
Wie ich das meine? es funktioniert ja! (also er fügt was in die table_Auftrag hinzu und gibt es auch aus), allerdings gibt er das nur beim 2. Klick auf dem Button aus (und das auch nur die zuletzt eingefügte Zeile, nicht die neue).
Ziemlich verwirrend, aber ich sitze hier schon seit Stunden und probiere verschiedene Konstelationen durch.
Habt ihr eine Idee wonach ich gucken soll? liegt ja anscheinend nur an der Ausgabe( neue Daten schreibt er ja rein...
MFG derPat18
Antworten
-
Ich beziehe mich ausschließlich auf das Click Ereignis, hier drauf:
private void button12_Click(object sender, EventArgs e) //Button "Auftrag erstellen" { eintrag_einfuegen_Auftrag(); string sql_Text = "delete from table_CD where Artikelnummer='" + textBox_Auftrag_Artikelnummer.Text + "'"; //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] db_execute_Artikel(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); liste_laden_Artikel(); //Befehl zur Funktion (die Funktion wurde oben wieder in der Void Anweisung genauer beschrieben) //<< Liste wieder ausgeben }
dort gehen die Aufrufe auf Artikel, nicht auf Auftrag. Allerdings wird in "eintrag_einfuegen_Auftrag" die vor dem Execute "liste_laden_Auftrag" ausgeführt - darum taucht der Eintrag aus dem vorherigen Einfügen auf.
Wie kommst Du auf die Idee das Form_Load für das Click Ereignis relevant ist?
- Gruß Florian
- Bearbeitet Florian Haupt Dienstag, 23. Januar 2018 09:50 - Ergänzung
- Als Antwort vorgeschlagen Guido Franzke Dienstag, 23. Januar 2018 14:43
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 31. Januar 2018 06:19
Alle Antworten
-
Ich nehme mal an es geht um die Anzeige des neuen Datensatzes, ich schätze du aktualisierst die Anzeige vor dem Einfügen und nicht nach dem Einfügen des neuen Datensatzes, so steht dort auch liste_laden_Artikel... und nicht wie ich erwarten würde liste_laden_Auftrag... - kurz gesagt, du hast nach dem kopieren des Codes versäumt den Aktualisierungsaufruf für die Aufträge anzupassen und so aktualisierst Du dort die Artikel Liste und nicht die Aufträge.
- Gruß Florian
-
Ich nehme mal an es geht um die Anzeige des neuen Datensatzes, ich schätze du aktualisierst die Anzeige vor dem Einfügen und nicht nach dem Einfügen des neuen Datensatzes, so steht dort auch liste_laden_Artikel... und nicht wie ich erwarten würde liste_laden_Auftrag... - kurz gesagt, du hast nach dem kopieren des Codes versäumt den Aktualisierungsaufruf für die Aufträge anzupassen und so aktualisierst Du dort die Artikel Liste und nicht die Aufträge.
- Gruß Florian
guter ansatzpunkt ja.
wenn ich die Anwendung öffne, wird ja theoretisch die liste aktuallisiert im Form LOAD
private void Form1_Load(object sender, EventArgs e) //Form Load Event { // TODO: Diese Codezeile lädt Daten in die Tabelle "dB_AuftragDataSet1.Table_Auftrag". Sie können sie bei Bedarf verschieben oder entfernen. this.table_AuftragTableAdapter1.Fill(this.dB_AuftragDataSet1.Table_Auftrag); // TODO: Diese Codezeile lädt Daten in die Tabelle "kunden_DBDataSet1.Table_Kunden". Sie können sie bei Bedarf verschieben oder entfernen. this.table_KundenTableAdapter1.Fill(this.kunden_DBDataSet1.Table_Kunden); // TODO: Diese Codezeile lädt Daten in die Tabelle "cD_DBDataSet2.Table_CD". Sie können sie bei Bedarf verschieben oder entfernen. this.table_CDTableAdapter2.Fill(this.cD_DBDataSet2.Table_CD); }
der Rechner zeigt mir ja die Datensätze der Tables an beim START (oder es steht in der Eigenschaft der DataGridViews)
Also ist glaube das fehlerhate VORHER aktualisieren schonmal auszuschließen, da der Datensatz ja NACH dem Button Klick in die DataGridView hinzugefügt werden soll (was ja komischerweise beim 1. Datensatz sofort geschieht wie es sein sollte)
kann es sein, dass der rechner mit den Codes von liste_laden durcheinander kommt?
MFG derPat18
-
Ich beziehe mich ausschließlich auf das Click Ereignis, hier drauf:
private void button12_Click(object sender, EventArgs e) //Button "Auftrag erstellen" { eintrag_einfuegen_Auftrag(); string sql_Text = "delete from table_CD where Artikelnummer='" + textBox_Auftrag_Artikelnummer.Text + "'"; //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] db_execute_Artikel(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); liste_laden_Artikel(); //Befehl zur Funktion (die Funktion wurde oben wieder in der Void Anweisung genauer beschrieben) //<< Liste wieder ausgeben }
dort gehen die Aufrufe auf Artikel, nicht auf Auftrag. Allerdings wird in "eintrag_einfuegen_Auftrag" die vor dem Execute "liste_laden_Auftrag" ausgeführt - darum taucht der Eintrag aus dem vorherigen Einfügen auf.
Wie kommst Du auf die Idee das Form_Load für das Click Ereignis relevant ist?
- Gruß Florian
- Bearbeitet Florian Haupt Dienstag, 23. Januar 2018 09:50 - Ergänzung
- Als Antwort vorgeschlagen Guido Franzke Dienstag, 23. Januar 2018 14:43
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 31. Januar 2018 06:19
-
Ich beziehe mich ausschließlich auf das Click Ereignis, hier drauf:
private void button12_Click(object sender, EventArgs e) //Button "Auftrag erstellen" { eintrag_einfuegen_Auftrag(); string sql_Text = "delete from table_CD where Artikelnummer='" + textBox_Auftrag_Artikelnummer.Text + "'"; //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] db_execute_Artikel(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); liste_laden_Artikel(); //Befehl zur Funktion (die Funktion wurde oben wieder in der Void Anweisung genauer beschrieben) //<< Liste wieder ausgeben }
dort gehen die Aufrufe auf Artikel, nicht auf Auftrag. Allerdings wird in "eintrag_einfuegen_Auftrag" die vor dem Execute "liste_laden_Auftrag" ausgeführt.
Wie kommst Du auf die Idee das Form_Load für das Click Ereignis relevant ist?
- Gruß Florian
mit dem Form LOAD habe ich nu gemeint, dass da die Daten gefüllt werden für die DataViewGrids.
Jedenfalls, DU BIST SUPER!!!!
1000 DANK, JETZT BIN ICH ENDLICH FERTIG! ICH LIEBE DICH :)
MFG derPat18
-
Hi,
für den Code ist der Programmierer verantwortlich und nur er kann eine unpassende Folge von Anweisungen programmieren.Im Form_Load nutzt Du mit dem Designer erzeugte Anweisungen (z.B. Datenpuffer, der mit new db_AuftragDataSet1 vom Designer im Designer-Code eingefügt wurde). In Deinen Codeabschnitten im Ausgangsposting nutzt Du andere Datenpuffer, die Du lädst, veränderst und speicherst. Damit hast Du in einer Anwendung unterschiedliche Datenhaltung, die zu undurchsichtigen Ergebnissen führen können.
Ich empfehle Dir, überall die einmal erzeugten Datenpuffer (und Adapter) durchgängig zu nutzen.
Zu Deinem Ausgangsposting ist noch zu bemerken, dass das Verketten von SQL-Anweisungen arge Probleme bringen kann (SQL-Injection, unpassende Typkonvertierung). Außerdem solltest Du disposable Objekte (z.B. SqlConnection) auch sauber aufräumen (mit Dispose), besser gleich einen using-Scope benutzen.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Bearbeitet Peter Fleischer Dienstag, 23. Januar 2018 09:54