Laden...

Daten aus OleDB Datenbank Löschen

Letzter Beitrag vor 17 Jahren 11 Posts 10.461 Views
Daten aus OleDB Datenbank Löschen

verwendetes Datenbanksystem: OleDB

Hi

Ich habe ein Problem mit dem Löschen aus einer Access-Datenbank per ExecuteNonQuery()

Folgendes wird ausgefüht:


        private void btnLöschen_Click(object sender, EventArgs e)
        {
            try
            {
                string sql = "DELETE FROM Fragen WHERE ID = '" + txtID.Text + "'";
                execNQuery(sql);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        private void execNQuery(string cmdText)
        {
            OleDbConnection conn = new OleDbConnection(Management.conStringDb);
            OleDbCommand cmd = new OleDbCommand(cmdText, conn);
            label1.Text = cmdText;
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            conn.Close();
        }

Die Spalte "ID" ist vom Typ "Zahl" (Anzeige von Access 2007)

Wenn ich den ExecuteNonQuery-Befehl ausführe, bekomme ich folgende Fehlermeldung:
"Datentypen in Kriterienausdruck unverträglich"

Was ist mein Fehler? Hinzufügen mit INSERT funktioniert. Nur löschen kann ich nicht.

Ich hoffe mir kann jemand helfen...

Grüße Ressi

ParameterCollection benutzen.

Warum?
SqlInjection und automatische ParameterConvertierung.
Denn nur Strings werden in '' gesetzt, zahlen nicht.

ok werde ich versuchen

Danke für die schnelle Hilfe

edit:

Gibt es noch eine andere Möglichkeit?

Plus:

"DELETE FROM Fragen WHERE ID = '" + txtID.Text + "'"

DELETE FROM wird nicht klappen, du musst schon angeben, was gelöscht werden soll. Vermutlich willst du alles, also DELETE * FROM schreiben.

DELETE FROM wird nicht klappen, du musst schon angeben, was gelöscht werden soll. Vermutlich willst du alles, also DELETE * FROM schreiben.

Entschuldige Egeria, aber Dein Beitrag führt völlig in die Irre: Der Befehl heißt nun 'mal "DELETE FROM" mit Angabe der Tabelle. Es werden natürlich alle Felder einer Zeile gelöscht; deshalb ist das '*' überflüssig, sondern gehört zu SELECT. Nach der Fragestellung von Ressi ist offensichtlich, dass genau eine Zeile gelöscht werden soll, nämlich die durch ID festgelegte. Er will also nicht "alles" löschen, sondern diese eine Zeile.

Die richtige (und einzig sinnvolle) Antwort hat FZelle gegeben.

Gibt es noch eine andere Möglichkeit?

Ja, aber wie gesagt keine sinnvolle. Jürgen

Genau juetho

ich möchte jeweils nur eine Zeile löschen.

Vielen Dank an euch für die wirklich schnelle Hilfe

Ich werden dann wohl auf die Lösung von FZelle zurückgreifen. Ich habe gehofft, dass ich auch mit ExecuteNonQuery Löschen kann, da ich auch das Hinzufügen in die Datenbank damit gemacht habe

Ich werden dann wohl auf die Lösung von FZelle zurückgreifen. Ich habe gehofft, dass ich auch mit ExecuteNonQuery Löschen kann, da ich auch das Hinzufügen in die Datenbank damit gemacht habe

Natürlich geht das mit **ExecuteNonQuery **(das ist ja eigentlich sinnvoll, denn Löschen ist keine Abfrage und liefert im Prinzip keinen Wert zurück). Dein obiger Fehler und der entsprechende Hinweis von FZelle haben nichts mit der Art des DbCommand.Execute zu tun, sondern ausschließlich mit DbCommand.Parameters.

Jürgen

@ressi:
Und wenn Du das nicht verstanden hast, wirst Du den selbern Fehler auch beim Insert gemacht haben.

Such bitte mal nach SqlInjection.
Da ist alles dazu erklärt.

Ok dann werde ich mich mal mit SqlInjection auseinandersetzen.

Der Insert Funktioniert normal:


string sql = "INSERT INTO Fragen(Variable1, Variable2, Variable3, Variable4, Variable5, Variable6, Variable7) VALUES ('" + Variable1.Text + " ', '" + Variable2.Text + "', '" + Variable3.Text + " ', '" + Variable4.Text + "', '" + Variable5.Text + "', '" + Variable6.Text + "', '" + Variable7.Text + "'
)";
execNQuery(sql);

edit:

mein Delete schaut jetzt so aus:


        private void execNQueryDel(int delID)
        {
            OleDbConnection conn = new OleDbConnection(Management.conStringDb);
            OleDbCommand cmd = new OleDbCommand("DELETE FROM Fragen WHERE ID = @ID", conn);

            cmd.Parameters.Add(new OleDbParameter("@ID", OleDbType.Integer));
            cmd.Parameters["@ID"].Value = delID;
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();      // Befehl wird gegen Datenbank ausgeführt
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            conn.Close();
        }

Es Funktioniert zwar, allerdings währe es gut wenn ihr mir vielleicht sagen könntet, ob das von der Programmierung her ok ist

Das Delete ist fast OK, das Close gehört in ein Finally.

Das Insert ist genau das was ich erwartet hatte.
Das sollte genauso mit Parametern arbeiten wie dein Delete.

Die erzeugung der Parameter kannst Du auch einfacher so erledigen:


cmd.Parameters.Add("@ID", OleDbType.Integer).Value = delID;

Oder bei eindeutigen Typen so:


cmd.Parameters.AddWithValue("@ID",delID);

Ok danke für die Tipps

werde mir das mit den Parametern zu gute führen. Ist übersichtlicher und iergendwie auch einfacher.