UPDATE Command wird nicht ausgeführt

Deletemaster

Erfahrenes Mitglied
Hallo zusammen,
in meinem WebFormular sind verschiedene TextBoxen und andere Steuerelemente, die ich mit Daten aus einer MySql-Tabelle fülle.
Wenn ich nun Veränderungen am DS vornehme, sollen diese natürlich per UPDATE in die DB geschrieben werden.
Hier mein UPDATE- Befehl (stark gekürzt, betrifft nur ein Steuerelement):
Code:
		private void btn_Aktualisieren_Click(object sender, System.EventArgs e)
		{

			OdbcCommand cmd = new OdbcCommand();
			cmd.Connection = conn;

			cmd.Parameters.Add("@VRN", txt_VRN.Text);
			cmd.Parameters.Add("@Vorname", txt_Vorname.Text);

			cmd.CommandText = "UPDATE Tabelle SET vorname =  @Vorname  WHERE vrn = @VRN";

			Daten_Laden();	//Es wird der Datensatz mit den Veränderungen angezeigt
			conn.Close();
		}
Habe ich hier etwas grundlegendes vergessen? Warum wird nichts in die DB geschrieben

Danke für Eure Hilfe
 

mage

Erfahrenes Mitglied
1.) seh ich nirgends das die Connection geöffnet wird - conn.Open()
2.) Fehlt die Ausführung des Command, als das senden an die Datenbank cmd.Execute.
 

Deletemaster

Erfahrenes Mitglied
Code:
private void btn_Aktualisieren_Click(object sender, System.EventArgs e)
{
		conn.Open();

		OdbcCommand cmd = new OdbcCommand();
		cmd.Connection = conn;

		cmd.Parameters.Add("@VRN", txt_VRN.Text);
		cmd.Parameters.Add("@Vorname", txt_Vorname.Text);

		cmd.CommandText = "UPDATE winners49 SET vorname =  @Vorname WHERE vrn = @VRN";
		cmd.ExecuteNonQuery();

//		Daten_Laden();	//Es wird der Datensatz mit den Veränderungen angezeigt

		conn.Close();
			
}

UPDATE wird nicht ausgeführt und liefert Keine Fehlermeldung
 

mage

Erfahrenes Mitglied
Keine Fehlermeldung, komisch.
Bist du dir sicher das der Code auch durchlaufen wird. Ggf. wurde die Ereignisbehandlung für die Prozedur abgeklemmt.
Schon mal einen Breakpoint gesetzt und geschaut, ob alles durchlaufen wird?
 

Deletemaster

Erfahrenes Mitglied
Habe ein bißchen probiert und es funktioniert, weiß aber nicht genau WARUM?
Lösung:
Code:
private void Aktualisieren()
{
	string str_VRN = txt_VRN.Text;
	string str_Vorname = txt_Vorname.Text;

	conn.Open();

	OdbcCommand cmd_UpdateCommand = new OdbcCommand();
	cmd_UpdateCommand.Connection = conn;

	cmd_UpdateCommand.Parameters.Add("@VRN", txt_VRN.Text);
	cmd_UpdateCommand.Parameters.Add("@Vorname", str_Vorname);

        cmd_UpdateCommand.Parameters.Add("@VRN", OdbcType.VarChar, 25).Value = str_VRN;


	cmd_UpdateCommand.CommandText = "UPDATE Tabelle SET vorname = '" + str_Vorname + "' WHERE vrn = ?";
	cmd_UpdateCommand.ExecuteNonQuery();
	
conn.Close();

	lbl_Info.Text = "Update erfolgreich";

	Daten_Laden();	//Es wird der Datensatz mit den Veränderungen angezeigt
}

Nun habe ich aber 30 Steuerlemente, die ich beim UPDATE beachten muss, daß wäre also ein "kilometerlanger" UPDATE-Befehl, zumal verschiedene Steuerelemente betroffen sind: TextBoxen, DropDownList, CheckBoxen; RadioButtons.

Kann ich den selektierten Datensatz nicht in ein DataSet laden, die Daten in meinen Steuerelementen ändern und beim Update:

if(ds.HasChanges())
{
da.Update(ds, "Tabelle");
}
Hab aber keinen Plan wie das geht, habe nur eine Lösung im Buch, indem die Daten in einem DataGrid stehen
Und hier wurde die Connection, INSERT-, DELETE-, UPDATE-Command vom Designer generiert. Das aber möchte ich nicht.
Ich möchte eine andere Lösung, dabei benötige ich Hilfe

Danke
 

Norbert Eder

Erfahrenes Mitglied
Und waurm willst du eine andere Lösung? Was daran passt dir nicht?

Zumal ich auch nicht glaube, dass dein Update-Statement korrekt funtkioniert, du definierst Parameter, die es in deiner Abfrage gar nicht gibt. Unabhängig dessen solltest du die Parameter NACH dem SQL-Statement hinzufügen. Alleine schon aus rein logischen Gründen.
 

Deletemaster

Erfahrenes Mitglied
Ich habe jetzt für jedes einzelne Steuerelement eine Update-Funktion geschrieben, und alle werden in der Funktion Aktualisieren(); nacheinander aufgerufen.
Meiner Meinung nach werden die Parameter benötigt beim o.g. Beispiel.
"VRN" ist die Bedingung (diese wird aus der TextBox gelesen
"Vorname" ist der Wert in der TextBox txt_Vorname
möglich wäre hier auch (...WHERE vrn = '" + str_Vrn + "') statt WHERE vrn = ?

Habe ich Dich falsch verstanden?
 

mage

Erfahrenes Mitglied
Von der Verwendung dynamisch zusammengesetzten SQL Statments sollte man absehen und auf die SQL Statment mit Parametern verwenden, die diese extremst anfällig sind für SQL Injection.
Dynamisch zusammengesetzt meint solche Konstrukte .. vrn = '" + str_Vrn + "...
Beim MSSQL Provider werden die Parameter im SQL String mit dem vorangestellten @ gekennzeichnet. Bei OleDB mit einem Fragezeichen. Wie es bei ODBC aussieht mußt du mal in der MSDN nachschauen.
Warum MS das nicht einheitlich gestaltet hat ist mir schleierhaft.
 

Norbert Eder

Erfahrenes Mitglied
Ein Beispiel zu ODBC und Parametern aus der MSDN:
C#:
string queryString = "SELECT * FROM Table1 WHERE Field1 LIKE ?";
OleDbCommand command = new OleDbCommand(queryString, connection);
command.Parameters.Add("@p1", OleDbType.Char, 3).Value = "a";
OleDbDataReader reader = command.ExecuteReader();
Auf die Reihenfolge ist zu achten.
 

Neue Beiträge