Autor |
Beitrag |
Orothred
Beiträge: 86
C# (VS 2005)
|
Verfasst: Mo 01.10.07 08:36
Hi. Mit folgendem Code suche ich nach datensätzen in meiner datenbank und möchte sie bearbeiten und aktualisieren:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| strArray[lstSuchergebnisse.SelectedIndex, 0] = txtName.Text;
strArray[lstSuchergebnisse.SelectedIndex, 1] = txtVorname.Text ;
strArray[lstSuchergebnisse.SelectedIndex, 2] = txtStrasse.Text;
strArray[lstSuchergebnisse.SelectedIndex, 3] = txtOrt.Text;
strArray[lstSuchergebnisse.SelectedIndex, 4] = txtPLZ.Text;
strArray[lstSuchergebnisse.SelectedIndex, 5] = txtTelefon.Text;
strArray[lstSuchergebnisse.SelectedIndex, 6] = txtemail.Text;
strArray[lstSuchergebnisse.SelectedIndex, 7] = txtGeburtstag.Text;
string strSQL = "";
try
{
OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Adressen.mdb");
con.Open();
strSQL = "INSERT INTO Adressen(Name, Vorname, Straße, Ort, PLZ, Telefon, Email, Geburtstag) VALUES (@Name, @Vorname, @Straße, @Ort, @PLZ, @Telefon, @Email, @Geburtstag)";
DataSet ds = new DataSet();
OleDbCommand cmd = new OleDbCommand(strSQL, con);
cmd.Parameters.Add("@Name", OleDbType.Variant, 50);
cmd.Parameters.Add("@Vorname", OleDbType.Variant, 50);
cmd.Parameters.Add("@Strasse", OleDbType.Variant, 50);
cmd.Parameters.Add("@Ort", OleDbType.Variant, 50);
cmd.Parameters.Add("@PLZ", OleDbType.Variant, 5);
cmd.Parameters.Add("@Telefon", OleDbType.Variant, 20);
cmd.Parameters.Add("@Email", OleDbType.Variant, 50);
cmd.Parameters.Add("@Geburtstag", OleDbType.Variant, 8);
cmd.Parameters["@Name"].Value = strArray[lstSuchergebnisse.SelectedIndex, 0];
cmd.Parameters["@Vorname"].Value = strArray[lstSuchergebnisse.SelectedIndex, 1];
cmd.Parameters["@Strasse"].Value = strArray[lstSuchergebnisse.SelectedIndex, 2];
cmd.Parameters["@Ort"].Value = strArray[lstSuchergebnisse.SelectedIndex, 3];
cmd.Parameters["@PLZ"].Value = strArray[lstSuchergebnisse.SelectedIndex, 4];
cmd.Parameters["@Telefon"].Value = strArray[lstSuchergebnisse.SelectedIndex, 5];
cmd.Parameters["@Email"].Value = strArray[lstSuchergebnisse.SelectedIndex, 6];
cmd.Parameters["@Geburtstag"].Value = strArray[lstSuchergebnisse.SelectedIndex, 7];
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} |
damit füge ich allerdings nur einen neuen datensatz in die datenbank ein, der alte, der eigentlich aktualisiert werden soll, bleibt erhalten. wie bekomme ich es hin, das der neue datensatz eingefügt und der alte gelöscht wird?
Moderiert von Gausi: Code- durch C#-Tags ersetzt
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 01.10.07 10:03
Hast Du Dich schon einmal grundlegend mit PrimaryKeys und SQL-Befehlen beschäftigt? In Deinem Code sehe ich nicht, dass Du eine ID o.ä. verwendest.
Dein Code passt auch überhaupt nicht zur Fragestellung:
- Ein Insert-Befehl dient zum Hinzufügen, nicht zum Ändern.
- Der Fill-Befehl des DataAdapters i.V.m. dem SelectCommand holt die Daten von der Datenbank; ich sehe aber nichts, womit Du Daten in die Datenbank transportieren willst.
- Ein Insert-Befehl in einem SelectCommand ist irgendwie widersinnig; das widerspricht sich ja schon von den Bezeichnungen her.
Worüber wunderst Du Dich also? Jürgen
|
|
Orothred
Beiträge: 86
C# (VS 2005)
|
Verfasst: Mo 01.10.07 10:13
die id ist in der datenbank vorhanden. indem ich diese mit in den code einbezogen habe, hat alles so funktioniert, wie ich es haben wollte.
deine bedenken kann ich deshalb nicht nachvollziehen, da jetzt alles funktioniert, mit dem code, der da steht
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 01.10.07 10:29
Orothred hat folgendes geschrieben: | die id ist in der datenbank vorhanden. indem ich diese mit in den code einbezogen habe, hat alles so funktioniert, wie ich es haben wollte.
deine bedenken kann ich deshalb nicht nachvollziehen, da jetzt alles funktioniert, mit dem code, der da steht |
Dann mache ich meine Zweifel mal konkreter:
- Wenn Du einen INSERT-Befehl vorbereitest, dann werden Daten eingefügt. (Woher die ID kommt, geht es Deinem Code nicht hervor.)
- Wenn Du einen Datensatz überschreiben willst, benötigst Du einen UPDATE-Befehl mit Bezug auf den Datensatz ("WHERE ID = @ID"), der zu ändern ist.
- Stattdessen kannst Du notfalls auch einen DELETE-Befehl mit einem INSERT-Befehl kombinieren. (Aber das wäre eher abwegig.)
- Für alles, was nicht SELECT ist, ist DbCommand.ExecuteNonQuery() das richtige Verfahren. (Bei vielen Änderungen geht auch DbDataAdapter.Update(), aber auch dafür werden die richtigen Befehle - InsertCommand, UpdateCommand, DeleteCommand - benötigt.)
Verstehst Du jetzt, warum ich keinen Zusammenhang zwischen Problem und Code in Deinem ersten Beitrag sehe? Jürgen
|
|
Orothred
Beiträge: 86
C# (VS 2005)
|
Verfasst: Mo 01.10.07 10:41
das mit dem WHERE ID = @ID hab ich ja jetzt auch so gemacht. aber es funktioniert trotzdem ohne UPDATE und sowas ^^ schau dir mein programm adressverwaltung im freeware-bereich an, da kannste dich ja davon überzeugen, das es funktioniert
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 01.10.07 10:55
Orothred hat folgendes geschrieben: | damit füge ich allerdings nur einen neuen datensatz in die datenbank ein, der alte, der eigentlich aktualisiert werden soll, bleibt erhalten. wie bekomme ich es hin, das der neue datensatz eingefügt und der alte gelöscht wird? |
Mit UPDATE statt INSERT. Dafür gibt es den SQL-Befehl.
Wenn Du auf Deinem Verfahren bestehst, dann musst Du nach dem INSERT noch ein DELETE machen. Aber mit dem richtigen Datensatz. Allerdings ist so eine Vorgehensweise "unüblich".
|
|
Orothred
Beiträge: 86
C# (VS 2005)
|
Verfasst: Mo 01.10.07 10:58
also ich habs mit INSERT und DELETE gemacht....dann isses eben "unüblich" ^^ abstrakte programmierung....etwas schaffen, was sonst keiner macht....so kann mans auch nennen ^^
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 01.10.07 11:02
Orothred hat folgendes geschrieben: | etwas schaffen, was sonst keiner macht |
Das hat schon seine Gründe, warum das sonst keiner macht. Du machst zwei DB-Zugriffe. Der Rest der Welt nur einen. Ich sehe da echte Vorteile. Abgesehen davon würde sich Dein Source verkleinern und besser zu warten sein. Aber mache es, wie Du willst.
Übrigens:
Probier doch mal, mit Deiner Methode 50000 Datensätze zu bearbeiten. Kannst dafür ja eine Schleife basteln. Du musst dafür nicht mal wirklich was am Datensatz ändern. Schau Dir die Größe der DB-Dateien vorher und hinterher an.
Zuletzt bearbeitet von jasocul am Mo 01.10.07 11:06, insgesamt 1-mal bearbeitet
|
|
JüTho
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 01.10.07 11:05
jasocul hat folgendes geschrieben: | Wenn Du auf Deinem Verfahren bestehst, dann musst Du nach dem INSERT noch ein DELETE machen. Aber mit dem richtigen Datensatz. Allerdings ist so eine Vorgehensweise "unüblich". |
Orothred hat folgendes geschrieben: | das mit dem WHERE ID = @ID hab ich ja jetzt auch so gemacht. aber es funktioniert trotzdem ohne UPDATE und sowas ^^ schau dir mein programm adressverwaltung im freeware-bereich an, da kannste dich ja davon überzeugen, das es funktioniert |
Mehr oder weniger als [OT] zu verstehen:
Wenn ich mir verschiedene Punkte anschaue - INSERT zum Ändern, Array als Ziel beim Einlesen, das "Durcheinander" der Klassen -, scheue ich mich, Deine Anwendung zu untersuchen. Es mag ja sein, dass es oberflächlich so läuft, wie Du es Dir vorstellst; ich habe aber den Eindruck, dass Du mit Deinem unüblichen Vorgehen sehr schnell an neue Klippen gerätst, dann das Problem nicht erkennst, neue Ratschläge mit Deinem Vorgehen nicht zusammenpassen und Dir als Hilfe deshalb nicht genügen.
Ich werde mich deshalb in diesem Zusammenhang auf einzelne Ratschläge beschränken. Jürgen
|
|
Orothred
Beiträge: 86
C# (VS 2005)
|
Verfasst: Mo 01.10.07 11:22
durcheinander der klassen musste mir erklären ^^
|
|
|