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.
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 344440
Url: https://administrator.de/forum/sql-befehle-dynamisch-aendern-c-sharp-und-access-344440.html
Ausgedruckt am: 22.12.2024 um 21:12 Uhr
5 Kommentare
Neuester Kommentar
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 ...
Oder statt
Da dieser in der ersten Schleife noch nicht existiert muss Du wohlmöglich vorher mit Contains(String) abfragen.
E.
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
E.
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
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:
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.
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";
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.
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
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
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.