MySQL Delete Row

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

    MySQL Delete Row

    Moin,

    folgendes Problem:

    ich arbeite mit Datenbanken die leider auf einem MySQL Server liegen. Umstellung nicht möglich.
    Ich pflege etwas in Datenbanken ein. Insert und Update kein Problem.

    z.B. so:

    VB.NET-Quellcode

    1. Dim cmdadd As New MySqlCommand
    2. cmdadd.Connection = conn
    3. If iMod = 0 Then
    4. cmdadd.CommandText = "INSERT INTO tb_room VALUES (NULL, ?NLNR, ?RAUMNR, ?ETAGE, ?BEZEICHNUNG, ?FUNKTION, ?NOTIZ, ?BILD, ?BILDNAME, ?BILDGROESSE)"
    5. Else
    6. cmdadd.CommandText = "UPDATE tb_room SET RAUMNR=?RAUMNR, ETAGE=?ETAGE, BEZEICHNUNG=?BEZEICHNUNG, FUNKTION=?FUNKTION, NOTIZ=?NOTIZ, BILD=?BILD, BILDNAME=?BILDNAME, BILDGROESSE=?BILDGROESSE WHERE RAUMNR=?OLDROOM"
    7. End If
    8. Dim FileSize As UInt32
    9. Dim rawData() As Byte = Nothing
    10. If tbImage.Text.Length > 0 Then
    11. Dim ms As New MemoryStream()
    12. If pbImage.Image IsNot Nothing Then
    13. pbImage.Image.Save(ms, ImageFormat.Png)
    14. rawData = ms.ToArray
    15. FileSize = ms.Length
    16. End If
    17. End If
    18. cmdadd.Parameters.AddWithValue("?NLNR", cbNLs.SelectedItem)
    19. cmdadd.Parameters.AddWithValue("?RAUMNR", tbRaumNr.Text)
    20. cmdadd.Parameters.AddWithValue("?ETAGE", cbEtage.SelectedItem)
    21. cmdadd.Parameters.AddWithValue("?BEZEICHNUNG", tbBez.Text)
    22. cmdadd.Parameters.AddWithValue("?FUNKTION", tbFunktion.Text)
    23. cmdadd.Parameters.AddWithValue("?NOTIZ", rtbInfo.Text)
    24. cmdadd.Parameters.AddWithValue("?BILDNAME", tbImage.Text)
    25. cmdadd.Parameters.AddWithValue("?BILDGROESSE", FileSize)
    26. cmdadd.Parameters.AddWithValue("?BILD", rawData)


    Jedoch klappt das Löschen nicht.

    VB.NET-Quellcode

    1. Public Sub Delete_Row(table_ As String, col As String, val As String, conn As MySqlConnection)
    2. conn.Open()
    3. Dim cmdDel As New MySqlCommand("DELETE FROM ?TABLE WHERE ?COL= ?VAL", conn)
    4. cmdDel.Parameters.AddWithValue("?TABLE", "tb_room")
    5. cmdDel.Parameters.AddWithValue("?COL", col)
    6. cmdDel.Parameters.AddWithValue("?VAL", val)
    7. cmdDel.ExecuteNonQuery()
    8. conn.Close()
    9. End Sub


    Error:
    MySql.Data.MySqlClient.MySqlException ist aufgetreten.
    ErrorCode=-2147467259
    HResult=-2147467259
    Message=You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''tb_room' WHERE 'RAUMNR'= 'R.150-02'' at line 1
    Number=1064
    Source=MySql.Data
    StackTrace:
    bei MySql.Data.MySqlClient.MySqlStream.ReadPacket()
    bei MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
    bei MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
    bei MySql.Data.MySqlClient.MySqlDataReader.NextResult()
    bei MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
    bei MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
    bei Inventarisierung.mod_SQL.Delete_Row(String table_, String col, String val, MySqlConnection conn) in PFAD....mod SQL.vb:Zeile 50.
    InnerException:

    Verstehe es nicht.
    Alle Variablen sind vorhanden und klappen auch im Insert. Finde dazu überhaupt nichts passendes. Über PHP klappt das ganze sofort.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @EaranMaleasi

    Wenn ich das ganze so ausführe:

    VB.NET-Quellcode

    1. conn.Open()
    2. Dim cmdDel As New MySqlCommand("DELETE FROM tb_room WHERE ?COL= ?VAL", conn)
    3. cmdDel.Parameters.AddWithValue("?COL", col)
    4. cmdDel.Parameters.AddWithValue("?VAL", val)
    5. cmdDel.ExecuteNonQuery()
    6. conn.Close()


    passiert einfach nichts.bekomme auch keine Rückmeldung... Komisch
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Identifier (wie z.B. Tabellen- oder Spaltennamen) können nicht als Parameter gesetzt werden.

    Und ob etwas bei DELETE FROM tb_room WHERE ?COL= ?VAL passiert, hängt von den Werten ab.
    Wenn z.B. beide Parameter den gleichen Wert enthalten, werden alle Datensätze in der Tabelle gelöscht. Im Endeffekt ist der Ausdruck dann äquivalent mit DELETE FROM tb_room WHERE x = x.
    Bei der Where-Klausel sagt der SQL-Standard nämlich nicht, dass bei einem Vergleich eine Spalte dabei sein muss. Auch ... WHERE 1=1 oder ... WHERE 1=0 sind völlig korrekte Bedingungen (die entweder alles, oder nichts selektieren).
    Habs mal so gemacht:

    VB.NET-Quellcode

    1. Public Sub Delete_Row(table_ As String, col As String, val As String, conn As MySqlConnection)
    2. Dim intID As Integer = -1
    3. intID = Convert.ToInt32(Get_Primary(table_, col, val, conn))
    4. conn.Open()
    5. Dim cmdDel As New MySqlCommand("DELETE FROM tb_room WHERE ID=" & intID, conn)
    6. cmdDel.ExecuteNonQuery()
    7. conn.Close()
    8. Refresh_Data()
    9. End Sub
    10. Public Function Get_Primary(table_ As String, col As String, val As String, conn As MySqlConnection) As String
    11. Dim strResult As String = ""
    12. Dim cmdGetPrimery As New MySqlCommand()
    13. conn.Open()
    14. cmdGetPrimery.CommandText = "SELECT ID FROM " & table_ & " WHERE " & col & " = """ & val & """"
    15. cmdGetPrimery.Connection = conn
    16. strResult = cmdGetPrimery.ExecuteScalar
    17. conn.Close()
    18. Return strResult
    19. End Function


    Witzergerweise spielt es eine Rolle ob ich über

    VB.NET-Quellcode

    1. cmdMySql.Parameters.AddWithValue("?param",value)

    oder direkt über den Commandtext

    Visual Basic-Quellcode

    1. cmdMySql.CommandText = "SELECT PRIMARY FROM " & varTable & " WHERE " & varCol & " = """ & varVAL & """"

    gehe. Bei der Variante über die Parameter gibt es nach wie vor einen Fehler.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~