Autor Beitrag
Orothred
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: 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:

ausblenden volle Höhe C#-Quelltext
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:
// Änderungen ins Array speichern

         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;

         // Variable für den SQL-Befehl
         string strSQL = "";

         try
         {
            // Connection zur Datenbank aufbauen
            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 und Command erzeugen
            DataSet ds = new DataSet();
            OleDbCommand cmd = new OleDbCommand(strSQL, con);

            // Definieren der Parameter
            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];



            // DataAdapter erzeugen, Kommando übergeben, Fill ausführen 
            OleDbDataAdapter da = new OleDbDataAdapter();
            da.SelectCommand = cmd;
            da.Fill(ds);
         }

         // Fehlerbehandlungsmethode
         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 user profile iconGausi: Code- durch C#-Tags ersetzt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mo 01.10.07 10:29 
user profile iconOrothred 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 01.10.07 10:55 
user profile iconOrothred 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 01.10.07 11:02 
user profile iconOrothred 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. :wink:

Ü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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mo 01.10.07 11:05 
user profile iconjasocul 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".

user profile iconOrothred 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Mo 01.10.07 11:22 
durcheinander der klassen musste mir erklären ^^