Laden...

SQL und ASP.NET´: Fehler im UPDATE Befehl?

Erstellt von schuppsl vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.154 Views
Hinweis von MarsStein vor 12 Jahren

verschoben aus Web-Technologien, da es sich nicht um ein web-spezifisches Problem handelt.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 12 Jahren
SQL und ASP.NET´: Fehler im UPDATE Befehl?

verwendetes Datenbanksystem: Access (?)

Hallo,ich habe bisher alle Daten in Dateien zwischengespeichert und mache nun erste Versuche mit Datenbanken in meiner ASP.NET Anwendung.

Dazu habe ich einfach eine Access Tabelle angelegt und ins Projekt eingefügt.
(city.mdb)

Einiges Funktioniert schon, einiges aber auch nicht.
Meine Mini Tabelle sieht so aus:

Spalten: ID und STRING
und eine Reihe: FTDELTAGE(ID) und 100(STRING)

Also pubseinfach.

Jetzt steht also in der Reihe FTDELTAGE der Wert 100 drin.

Diesen Wert möchte ich nun ändern, per UPDATE Befehl, das sieht so aus:



 string neuBerTage= txtNeuBerTage.Text;

            try
            {
                OleDbConnection myConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|city.mdb");

                OleDbCommand myComm = new OleDbCommand("UPDATE city SET STRING=@neuBerTage WHERE ID=FTDELTAGE", myConn);
                        

                myConn.Open();
                myComm.ExecuteNonQuery();
                myConn.Close();
            }
            catch (Exception ex)
            {
                string gmess = ex.Message;
            }

Also der UPDATE Befehl lautet also:

UPDATE city SET STRING=@neuBerTage WHERE ID=FTDELTAGE

Die Fehlermeldung lautet: "Fehler im UPDATE Befehl."

Ich habe ihn schon tausendmal geändert und auch sogar auf meine Datenbank im www, per PHPmyAdmin die tabelle nachgebaut und den Befehl übernommen: Gleicher Fehler.

Was ist also an diesem simplen Befehl falsch?

Danke

296 Beiträge seit 2007
vor 12 Jahren

Hallo schuppsl,

versuchs mal so:


OleDbCommand myComm = new OleDbCommand("UPDATE city SET STRING='"+@neuBerTage+"' WHERE ID='FTDELTAGE'", myConn);

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 12 Jahren

Hi, danke.
Leider diesselbe Fehlermeldung: > Fehlermeldung:

Syntaxfehler in UPDATE-Anweisung.

EDIT: habs herausgefunden.
STRING ist natürlich ein reserviertes Wort und darf nicht verwendet werden. 😦

EDIT: Ist eigentlich sinnvoll wenige Daten in einer DB zu speichern, oder sind da doch Textdateien sinnvoller?

F
10.010 Beiträge seit 2004
vor 12 Jahren

@myUnderTakeR:
Das ist falsch.

@schuppsl:
Du solltest einfach verstehen was du machst und nicht herumprobieren.

  1. Wenn du schon die Parametercollection benutzt, dann erlese doch bitte auch wie das geht.
  2. Feste Parameter müssen natürlich SqlConform angegeben werden, sind aber bei Benutzung von Parametern nicht nötig.
  3. Davon das du irgendwelche Variablennamen in strings packst passiert da nichts magisch von alleine.
  4. Erst schauen was alles reservierte Wörter in Sql Sind, dann benutzen.
  5. Zu Access und OleDB gibt es genug dokumentierte Beispiele hier im Forum.

string neuBerTage= txtNeuBerTage.Text;

try
{
  using( OleDbConnection myConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|city.mdb"))
    

    OleDbCommand myComm = new OleDbCommand("UPDATE city SET [STRING]=? WHERE ID=?", myConn);

    myComm.Parameters.AddWithValue("@neuBerTage",neuBerTage);
    myComm.Parameters.AddWithValue("@FTDELTAGE","FTDELTAGE");

    myConn.Open();
    myComm.ExecuteNonQuery();
  }
}
catch (Exception ex)
{
   //Vernünftiges Exceptionmanagement
}

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

Wenn Spaltennamen SQL-Keywords entsprechen, kann man den Spaltennamen in eckige Klammern setzen, dann wird es nicht mehr als Keyword erkannt, also hier [STRING]
Wenn man es selbst in der Hand hat, sollte man sowas aber tunlichst vermeiden

@myUnderTaker
Schau Dir mal den Beitrag von FZelle an. Zur Erkläriung warum Dein Vorschlag falsch ist:
Das ist anfällig für SQL-Injection und somit hochgradig gefährlich!

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

296 Beiträge seit 2007
vor 12 Jahren

@myUnderTakeR:
Das ist falsch.

Aha danke für die Information, da bekommt man ja richtig Lust nochmal zu versuchen jemanden zu helfen.

Zur Erkläriung warum Dein Vorschlag falsch ist:
Das ist anfällig für SQL-Injection und somit hochgradig gefährlich!

Gut das es hier auch noch Mitglieder gibt, die nicht alles, auf jedem Gebiet, für selbstverständlich nehmen und als bekannt vorraussetzen, sondern auf eine nette Weise auf Fehler hinweisen und sogar Anmerkungen dazu geben, was daran kritisch ist.

Aber dann sollte doch wenigstens das mdb-File mit einem Passwort geschützt werden oder? Sonst kann man die Eingabe soviel vor Injection schützen, wie man will.

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

Aber dann sollte doch wenigstens das mdb-File mit einem Passwort geschützt werden oder? Sonst kann man die Eingabe soviel vor Injection schützen, wie man will.

Naja, wir reden ja hier von einer Webanwendung. Dabei liegt die DB auf dem Server und ist für den Benutzer nicht direkt zugänglich, nur die Serveranwendung kann darauf zugreifen (es sei denn jemand sitzt direkt am Server).

Der Parameter kommt aber vermutlich vom Client, und mit einem präparierten Statement könnte der Benutzer über SQL-Injection belibig viel Unsinn treiben. Das gilt es zu verhindern.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

F
10.010 Beiträge seit 2004
vor 12 Jahren

@myUnderTakeR:

Aha danke für die Information, da bekommt man ja richtig Lust nochmal zu versuchen jemanden zu helfen.

Helfen würde aber bedeuten das Du weist wie man es machen sollte, das sieht in deinem Text aber eher nicht so aus.

Vorsorglich, bevor du dich da in etwas reinsteigerst:
[Artikelserie] Parameter von SQL Befehlen

296 Beiträge seit 2007
vor 12 Jahren

Hallo FZelle,

danke für den Artiel und keine Sorge, dass ich mich in irgendetwas reinsteigere - ich wurde ja schon davon überzeugt, dass genannter Weg nicht der Richtige ist.

Wie bereits gesagt, habe ich versucht jemandem besten Gewissens zu helfen. Das ich damit auf dem Holzweg war, wurde mir ja auch erst bewusst, als ihr mich darauf hingewiesen habt.

Trotzdem finde ich, dass das Board einen ziemlich guten Ruf hat, was die Hilfsbereitschaft, Kommunikation und den Ton untereinander angeht und sowas bin ich hier eben nicht gewöhnt. Wäre halt schön, wenn du dein Wissen und deine Erfahrung mit uns Anderen teilen würdest, anstatt jedem erstmal einen ordentlich Schuß vor den Bug zu verpassen, aber das Leben ist kein Wunschkonzert 😃

Hinweis von gfoidl vor 12 Jahren

OK - damit soll wieder Ende dieser Diskrepanz sein. Danke.