Laden...

Auslesen und Bearbeiten EINES SQL-Datenbank-Tabellen-Eintrags

Erstellt von Psychooo vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.733 Views
P
Psychooo Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren
Auslesen und Bearbeiten EINES SQL-Datenbank-Tabellen-Eintrags

Hallo Programmierer,

ich bin neu hier und verfasse selten selbst Foreneinträge, da ich meistens alles per Suchfunktion finde, also bitte ich darum, meine etwaigen Anfängerfehler zu entschuldigen.

Ich habe ein Programm erstellt, welches neue Einträge in eine Tabelle "login" einer SQL-Datenbank schreiben und diese auch wieder löschen kann.

Das Programm soll nun auch bereits vorhandene Tabelleninhalte auslesen und verändern können.
Das sieht bis jetzt so aus: In einer ComboBox schreibt der Benutzer einen Namen, klickt auf einen "suchen"-Button und alle in der Datenbank-Tabelle gefundenen Einträge, die in der Spalte "Anmeldung" den eingegebenen Text enthalten, werden in der ComboBox aufgelistet.
Jetzt - so sollte es sein - klickt der Benutzer einen der ComboBox-Einträge an und dessen einzelne Daten erscheinen in verschiedenen Textfeldern (siehe Screenshot im Anhang).

Mein erstes Problem:
Ich bekomme es nicht fertig, die zu dem in der ComboBox ausgewählten Namen "Anmeldung" gehörigen Daten (Adress-ID, Person-ID, Passwort, ...) in die Textfelder einzulesen.

Mein zweites Problem:
Wie schreibe ich die in den Textfeldern veränderten Daten durch das Click-Event des Buttons "Änderungen übernehmen" zurück in die Datenbank?

Meine Ansätze:
Zum ersten Problem:


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            OdbcCommand DbAdress = DbConnection.CreateCommand();
            DbAdress.CommandText = "select adresse_id from login where anmeldung = '" + comboBox1.Text + "'";
            OdbcDataReader DbRdrAdress = DbAdress.ExecuteReader();
            txt_adressID.Text = DbRdrAdress.GetString(0).ToString();
        }

Hier erscheint die Fehlermeldung:
"InvalidOperationException wurde nicht behandelt: Keine Daten für die Zeile/Spalte."
Das heißt wohl, dass ich beim Auslesen einen Fehler mache. Der SQL-Befehl ist richtig, das habe ich bereits überprüft.

Zum zweiten Problem:


Leider = Ueberhaupt.Keine(Ahnung);

Ich hoffe, ich konnte mein Problem verständlich rüberbringen und bedanke mich schon mal im Voraus für alle Antworten.

PS: Bitte unterlasst Antworten wie "www.gidf.de" & Co., wie gesagt finde ich sonst so ziemlich alles und ich würde hier nicht um Hilfe bitten, wenn ich bei meiner Suche Erfolg gehabt hätte. Vielen Dank 😃

S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

verwendest du MS SQL? Dann könntest du direkt SqlConnection und SqlCommadn benutzen.

Weiterhin solltest du dir DataSet bzw DataTable mal anschauen.
Wenn du nur mit einem Reader arbeitest, müsstest du dir deine Statements selbst zusammen bauen.

Noch fortgeschrittener wäre LinqToSql bzw EntityFramework....aber ich glaube, für deinen Fall tut es auch DataSet und TableAdapter.

mfg
serial

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

willkommen bei myCSharp.de

Das Auslesen klappt, hast du jedenfalls gesagt. Deshalb würde ich einfach in C# eine Datenstruktur erstellen in der du dir die ganzen Details zu einem Login speicherst.
Die ganzen Logins knallst du dann einfach in eine List<T> und zeigst diese dann in deiner ComboBox an.

Wenn in der CmbBox das SelectedItem verändert wird (also ein anderer Login gewählt wird) dann muss du die Daten in den Textfeldern aktualisieren.
Indem du das aktuell selektierte Item auf deine Datenstruktur castest und dann die Werte deinen TextBoxen zuweist.

Wenn der Benutzern dann einen Wert ändert und auf übernehmen klickt, kannst du einfach das UpdateStatement generieren und dieses auf der DB ausführen.
Wie ein Update auszusehen hast findest du in Google

PS: Die Query-Strings bittte nie einfach mit + zusammenhängen da man sich damit nur Probleme macht.
Verwende besser die SqlParameter

Man kann auch einen OR-Mapper (wie NHibernate oder EF) einsetzen um solche Dinge zu erreichen. Das ist aber nicht so einfach zu verstehen wie das einzusetzen ist

Gruss
Michael

P
Psychooo Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren

Vielen Dank für Eure Antworten 🙂

Ihr habt mir wirklich sehr weiter geholfen, trotzdem hab ich es letztendlich ein wenig anders bzw. einfacher gelöst... Ist mit 100%iger Sicherheit nicht die sauberste oder beste Lösung, aber sie funktioniert ;D

Da ich es sehr schätze, wenn in Foren am Schluss auch eine Lösung / ein Lösungsansatz zur gestellten Frage angegeben ist, poste ich hier mal wie ich es gelöst hab:

So lese ich die zum in der ComboBox ausgewählten Namen gehörigen Daten in die einzelnen TextBoxen (am Beispiel der Adress-ID):


// Erstellen eines neuen OdbcCommand und zuweisung des SQL-Select-Befehls.
OdbcCommand DbAdress = DbConnection.CreateCommand();
DbAdress.CommandText = "select adresse_id from login where anmeldung = '" + comboBox1.Text + "'";
// Ausführen des OdbcCommand.
OdbcDataReader DbRdrAdress = DbAdress.ExecuteReader();

int fCountSuchAnm = DbRdrAdress.FieldCount;
// Schreiben des OdbcDataReader-Ergebnisses in die TextBox (hätte ich auch ohne die String-Variable col machen können...).
while (DbRdrAdress.Read())
{
   for (int i = 0; i < fCountSuchAnm; i++)
   {
      if (!DbRdrAdress[i].Equals(System.DBNull.Value))
      {
         String col = DbRdrAdress.GetDecimal(0).ToString();
         txt_adressID.Text = col;
      }
   }
}

So schreibe ich die geänderten Einträge zurück in die Datenbank (auch am Beispiel der Adress-ID):


OdbcTransaction TraAdressID = DbConnection.BeginTransaction();
// SQL-Befehl in string-Variable schreiben.
string scommand = "update login set adresse_id = " + txt_adressID.Text.ToString() + " where anmeldung = '" + comboBox1.Text.ToString() + "';";
// Neues OdbcCommand erstellen und SQL-Befehl sowie OdbcConnection zuweisen.
OdbcCommand editAdressID = new OdbcCommand(scommand, DbConnection);
// Dem OdbcCommand die Transaction zuweisen.
editAdressID.Transaction = TraAdressID;
// OdbcCommand ausführen.
editAdressID.ExecuteNonQuery();
// Update-Befehl bestätigen (SQL-Befehl "commit;").
TraAdressID.Commit();

Bevor jetzt aber jemand anderes meine Fehler copy-pastet bitte ich um Berichtigung meiner Fehler. Es funktioniert zwar bei mir, aber dass der Programmierstil nicht gut ist weiß ich selbst 😉 Auch meine Kommentare sind nicht unbedingt richtig, die hab ich jetzt auf die schnelle im Nachhinein hinzugefügt ^^

Gruß,
Psychooo

P
Psychooo Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren

PS: So sieht mein Ergebnis aus:

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Psychooo,

warum verwendest du nicht einfach einen O/R-Mapper? michlG sagte das ja schon bereits. Dann brauchst du auch nicht mehr solch komplexte Konstrukte zu schreiben.

zero_x

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

zusätzlich zu dem Hinweis von zero_x, möchte ich dich noch auf die SqlParameter hinweisen.

Wenn du die Queries nur so zusammenbastelst


// SQL-Befehl in string-Variable schreiben.
string scommand = "update login set adresse_id = " + txt_adressID.Text.ToString() + " where anmeldung = '" + comboBox1.Text.ToString() + "';";

machst du dir nur selbst das Leben schwer.
Erstens ist es fehleranfälliger.
Zweitens musst du darauf achten dass du die Typen richtig konvertierst und somit ist es auch fehleranfällig (speziell bei DateTime Werten usw.)
Drittens ist es sehr gefährlich weil die Benutzer über SQL-Injection einen Text (Query) reinschreiben könnten die dann ausgeführt wird und dir z.B. eine Tabelle löscht 😉

Du musst das natürlich nicht machen, aber es ist aus dem genannten Gründen zu empfehlen 😃

Grüsse