judo99
Goto Top

SQL Befehle dynamisch ändern C Sharp und Access

Liebe Community
ich habe derzeit ein kleines Problem.

Ich arbeite mit Visual Studio 2015 Community und einer .mdb Database.
Nun möchte ich in einer Spalte meiner Tabelle alle Werte um eins erhöhen.
Dies klappt auch wunderbar, allerdings nur beim ersten Datensatz.

            OleDbCommand Select = conn.CreateCommand();
            Select.CommandText = "SELECT * FROM Tabelle1";  
            OleDbCommand Update = conn.CreateCommand();
            Update.CommandText = "UPDATE Tabelle1 SET Klasse = @klasse WHERE ID = @id";  

            conn.Open();
            OleDbDataReader Reader = Select.ExecuteReader();
            while (Reader.Read())
            {
                ID = Convert.ToString(Reader["ID"]);  
                Klasse = Convert.ToInt32(Reader["Klasse"]);  
                Klasse++;
                Update.Parameters.AddWithValue("@klasse", Klasse);  
                Update.Parameters.AddWithValue("@id", ID);  

                Update.ExecuteNonQuery();
            }

Der Code an sich ist ja nicht fehlerbehaftet, aber warum wird der CommandText nicht aktualisiert und wie umgehe ich den "Fehler" ?

Vielen Dank im voraus!

P.S.:Die Zeilen zum herstellen der Verbindung habe ich mal weggelassen, da sie ja für das Problem nicht von Belangen sind.

Content-Key: 344440

Url: https://administrator.de/contentid/344440

Ausgedruckt am: 19.03.2024 um 02:03 Uhr

Mitglied: emeriks
emeriks 25.07.2017 um 21:25:59 Uhr
Goto Top
Hi,
der CommandText würde bei Deinem Konzept eh nicht aktualisiert, weil das keine Substitutions-Variablen (Platzhalter) sind.

Ich denke, Du musst vor dem Update.Parameters.AddWithValue ein Update.Parameters.Clear ausführen, weil Du einen Parameter mit dem selben Namen nicht mehrmals hinzufügen kannst.

https://msdn.microsoft.com/de-de/library/system.data.oledb.oledbparamete ...
AddWithValue(String, Object) - Adds a value to the end of the OleDbParameterCollection.

Oder statt
Update.Parameters.AddWithValue("@klasse", Klasse);   
Update.Parameters.Item("@klasse").Value = Klasse   
Da dieser in der ersten Schleife noch nicht existiert muss Du wohlmöglich vorher mit Contains(String) abfragen.

E.
Mitglied: SeaStorm
SeaStorm 26.07.2017 aktualisiert um 07:53:01 Uhr
Goto Top
Hi

zu deinem Problem erst mal:
Du musst entweder jedes mal den parameter leeren und neu setzen, wie emeriks das schon geschrieben hat.
Etwas sauberer wäre es, in dem while jeweils eine neue Instanz von CreateUpdate zu machen, also das
OleDbCommand Update = conn.CreateCommand(); 
  Update.CommandText = "UPDATE Tabelle1 SET Klasse = @klasse WHERE ID = @id";   
innerhalb des Whiles.


aber ...
du machst ja nix anderes als bei jedem Datensatz den Wert der Klasse um 1 zu erhöhen.
Das musst du nicht Zeile für Zeile "manuell" machen. Das geht mit einem UPDATE ganz stumpf:
UPDATE Tabelle1 SET Klasse = Klasse +1

Vorrausgesetzt du machst natürlich nicht noch andere Dinge die wie hier jetzt nicht sehen. Aber prinzipiell kannst du dir da den Aufwand und auch die zusätzliche "Last" im Programm sparen.
Mitglied: Apophis
Apophis 26.07.2017 um 15:42:24 Uhr
Goto Top
Hallo,

mal abgesehen davon, daß der UPDATE-Befehl über die ganze Tabelle deutlich besser ist, fällt mir auf, daß ich keinen Befehl erkenne, mit dem Du innerhalb der WHILE-Schleife (und zwar am Ende) den nächsten Datensatz ansteuerst. Mir fehlt ein MoveNext, oder wie das in Visial Studio auch immer heissen mag.

Gruß
Apophis
Mitglied: emeriks
emeriks 26.07.2017 um 15:49:40 Uhr
Goto Top
mal abgesehen davon, daß der UPDATE-Befehl über die ganze Tabelle deutlich besser ist, fällt mir auf, daß ich keinen Befehl erkenne, mit dem Du innerhalb der WHILE-Schleife (und zwar am Ende) den nächsten Datensatz ansteuerst. Mir fehlt ein MoveNext, oder wie das in Visial Studio auch immer heissen mag.
Reader.Read setzt den Zeiger automatisch auf den nächsten Datensatz.
Mitglied: atze187
atze187 28.07.2017 um 09:18:35 Uhr
Goto Top
du machst ja nix anderes als bei jedem Datensatz den Wert der Klasse um 1 zu erhöhen.
Das musst du nicht Zeile für Zeile "manuell" machen. Das geht mit einem UPDATE ganz stumpf:
UPDATE Tabelle1 SET Klasse = Klasse +1

Klasse, 1+ face-smile