"Roh-SQL" auf MySQL funktioniert / parametrisiert in VB nicht

  • VB.NET
  • .NET (FX) 4.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    "Roh-SQL" auf MySQL funktioniert / parametrisiert in VB nicht

    Hallo Leute,

    Ich habe ein kleines Query, welches auf dem MySQL-Server direkt wunderbar funktioniert, wenn ich es aber dann in eine String-Variable in VB zum parametrisieren packe, spuckt mir der MySQL-Server einen Syntax-Fehler aus.

    Quellcode

    1. "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 ''3040_messdaten' m, '3040_rauheiten' r WHERE m.TXLCode LIKE 'GW101%' AND m.TXLCo' at line 1"


    Roh-SQL:

    SQL-Abfrage

    1. SELECT
    2. m.TXLCode,
    3. m.ol1,
    4. m.ol2,
    5. m.ow1,
    6. m.ow2,
    7. m.r11,
    8. m.r12,
    9. m.r13,
    10. m.r21,
    11. m.r22,
    12. m.r23,
    13. m.r31,
    14. m.r32,
    15. m.r33,
    16. m.r41,
    17. m.r42,
    18. m.r43,
    19. r.lw,
    20. r.cw
    21. FROM
    22. 3040_messdaten m,
    23. 3040_rauheiten r
    24. WHERE
    25. m.TXLCode LIKE 'GW101%' /* Tool 1 */
    26. AND
    27. m.TXLCode = r.TXLCode


    Dieser dann in VB:

    VB.NET-Quellcode

    1. Public Function get_messwerte(ByVal _type As String, Optional ByVal _toolFilter As String = "none") As List(Of String)
    2. Dim iReturn As New List(Of String)
    3. Dim SQLString As String = ""
    4. Dim messtable As String = "", rautable As String = ""
    5. Dim trv() As String = {"Tool", "Rev", "Part"}
    6. If _toolFilter = "none" Then
    7. Select Case _type
    8. Case "3040"
    9. messtable = "3040_messdaten"
    10. rautable = "3040_rauheiten"
    11. Case "2121"
    12. messtable = "2121_messdaten"
    13. rautable = "2121_rauheiten"
    14. Case "2121C"
    15. messtable = "2121C_messdaten"
    16. rautable = "2121C_rauheiten"
    17. Case "3030"
    18. messtable = "3030_messdaten"
    19. rautable = "3030_rauheiten"
    20. Case Else
    21. Hilfssachen.ShowError(funcinfo.GetCurrentMethod.Name, "Falscher Bauteiltyp angegeben:" + CrLf + "_type = " + _type)
    22. iReturn.Clear()
    23. Return iReturn
    24. End Select
    25. End If
    26. SQLString = "SELECT m.TXLCode, m.ol1, m.ol2, m.ow1, m.ow2, " _
    27. + "m.r11, m.r12, m.r13, m.r21, m.r22, m.r23, " _
    28. + "m.r31, m.r32, m.r33, m.r41, m.r42, m.r43, " _
    29. + "r.lw, r.cw " _
    30. + "FROM @MessTable m, @RauTable r " _
    31. + "WHERE m.TXLCode LIKE 'GW101%' " _
    32. + "AND m.TXLCode = r.TXLCode"
    33. MessageBox.Show(SQLString)
    34. Try
    35. Using conn As New MySqlConnection(connectstring), cmd As New MySqlCommand(SQLString, conn)
    36. cmd.Parameters.AddWithValue("@MessTable", messtable)
    37. cmd.Parameters.AddWithValue("@RauTable", rautable)
    38. conn.Open()
    39. Dim reader As MySqlDataReader = cmd.ExecuteReader
    40. If reader.HasRows Then
    41. reader.Read()
    42. If _type = "3040" Or _type = "3030" Then
    43. trv = Hilfssachen.getToolRevPart(reader.Item("TXLCode").ToString)
    44. iReturn.Add(reader.Item("TXLCode").ToString)
    45. iReturn.Add(trv(0).ToString)
    46. iReturn.Add(trv(1).ToString)
    47. iReturn.Add(trv(2).ToString)
    48. iReturn.Add(reader.Item("ol1").ToString)
    49. iReturn.Add(reader.Item("ol2").ToString)
    50. iReturn.Add(reader.Item("ow1").ToString)
    51. iReturn.Add(reader.Item("ow2").ToString)
    52. iReturn.Add(reader.Item("r11").ToString)
    53. iReturn.Add(reader.Item("r12").ToString)
    54. iReturn.Add(reader.Item("r13").ToString)
    55. iReturn.Add(reader.Item("r21").ToString)
    56. iReturn.Add(reader.Item("r22").ToString)
    57. iReturn.Add(reader.Item("r23").ToString)
    58. iReturn.Add(reader.Item("r31").ToString)
    59. iReturn.Add(reader.Item("r32").ToString)
    60. iReturn.Add(reader.Item("r33").ToString)
    61. iReturn.Add(reader.Item("r41").ToString)
    62. iReturn.Add(reader.Item("r42").ToString)
    63. iReturn.Add(reader.Item("r43").ToString)
    64. iReturn.Add(reader.Item("lw").ToString)
    65. iReturn.Add(reader.Item("cw").ToString)
    66. ElseIf _type = "2121" Or _type = "2121C" Then
    67. trv = Hilfssachen.getToolRevPart(reader.Item("TXLCode").ToString)
    68. iReturn.Add(reader.Item("TXLCode").ToString)
    69. iReturn.Add(trv(0).ToString)
    70. iReturn.Add(trv(1).ToString)
    71. iReturn.Add(trv(2).ToString)
    72. iReturn.Add(reader.Item("ol").ToString)
    73. iReturn.Add(reader.Item("ow").ToString)
    74. iReturn.Add(reader.Item("r11").ToString)
    75. iReturn.Add(reader.Item("r12").ToString)
    76. iReturn.Add(reader.Item("r21").ToString)
    77. iReturn.Add(reader.Item("r22").ToString)
    78. iReturn.Add(reader.Item("r31").ToString)
    79. iReturn.Add(reader.Item("r32").ToString)
    80. iReturn.Add(reader.Item("r41").ToString)
    81. iReturn.Add(reader.Item("r42").ToString)
    82. iReturn.Add(reader.Item("lw").ToString)
    83. iReturn.Add(reader.Item("cw").ToString)
    84. End If
    85. End If
    86. reader.Close()
    87. End Using
    88. Catch ex As Exception
    89. Hilfssachen.ShowError(funcinfo.GetCurrentMethod.Name, ex.Message)
    90. End Try
    91. Return iReturn
    92. End Function


    Was aufällt ist, dass die Parameter in SingleQuotes gepackt wurden. MySQL erwartet dort doch ` anstatt ', oder?

    Kann ich überhaupt Tabellennamen parametrisieren?

    Grüße!

    Edit: Hab die reader.Item-Bezeichner korrigiert.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „hirnwunde“ ()

    In dem von Dir verlinktem Post ist unter dem Abschnitt "Allgemeine Einschränkungen" zu lesen:


    Parameter sind nur vorgesehen, um Inhalte variabel zu übergeben. Sie können nicht statt der Namen von Tabellen oder Spalten benutzt werden. So etwas geht überhaupt nicht:

    C#-Quellcode

    1. cmd.CommandText = "UPDATE @table SET @column = @value;";
    2. cmd.Parameters.AddWithValue("@table", "Adress");
    3. cmd.Parameters.AddWithValue("@column", "Prename");
    4. cmd.Parameters.AddWithValue("@value", "Juergen");

    Allenfalls auf dem folgenden Weg können Tabellen und Spalten variabel gestaltet werden:

    C#-Quellcode

    1. cmd.CommandText = String.Format("UPDATE {0} SET {1} = @value;", "Adress", "Prename");
    2. cmd.Parameters.AddWithValue("@value", "Juergen");

    Ja - vergiss den letzten Post von mir... :/
    Da war ich mit den Gedanken schon wieder weiter unten im Text z.B:
    cmd.CommandText = String.Format("UPDATE {0} SET {1} = @value;", "Adress", "Prename")
    cmd.Parameters.AddWithValue("@value", "Juergen")
    ...aber dass bedeutet nicht mehr parametrisieren...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VB1963“ ()

    Das hier

    VB.NET-Quellcode

    1. Public Function get_messwerte(ByVal _type As String, Optional ByVal _toolFilter As String = "none") As List(Of String)
    ist ziemlicher Mist.
    Messwerte sind allerhöchstwahrscheinlich anderen Datentyps als String.

    Bzw. wenn du sie bereits in der Datenbank als Textwerte angelegt hast, ist bereits das Mist.

    Ich empfehle immer, Datenverarbeitungen erstmal ohne Datenbank auszuprogrammieren, dann würde der nun erforderliche Umbau wesentlich leichter vonstatten gehen.
    Hey EDR,

    ja ... prinzipiell sind die Messwerte Floats. Aber in der Liste werden eben auch Daten wie die Bauteilbezeichnung mitgeliefert,
    und das ist ein String. Ebenso gibts in der Tabelle auch noch ein Datums-Feld, das (in einem anderen Programm) auch in die Liste sollte.

    Da ich aber nicht ein solch ausgeklügeltes Datenbankmodell basteln kann, wie es möglich wäre, habe ich in allen meinen Tabellen sowohl Floats und Strings.
    Allerdings sind die Datenfelder in der Tabelle selbst schon als Decimal definiert, wo es von nöten ist.

    Wie ich in einer Liste Daten verschiedenen Typs speichere, weiss ich nicht.
    Wie ich aus einer Funktion mehrere Rückgabewerte ausgebe, weiss ich ebensowenig.