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

Printed on: April 19, 2024 at 00:04 o'clock

Member: emeriks
emeriks Jul 25, 2017 at 19:25:59 (UTC)
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.
Member: SeaStorm
SeaStorm Jul 26, 2017 updated at 05:53:01 (UTC)
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.
Member: Apophis
Apophis Jul 26, 2017 at 13:42:24 (UTC)
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
Member: emeriks
emeriks Jul 26, 2017 at 13:49:40 (UTC)
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.
Member: atze187
atze187 Jul 28, 2017 at 07:18:35 (UTC)
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