INSERT Syntax Error

  • VB.NET

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

    INSERT Syntax Error

    Hey,

    warum bekomm ich denn eine Fehlermeldung, vonwegen mein Syntax passt nicht?

    SQL-Abfrage

    1. INSERT INTO Benutzer (ID, Username, Password, Bereich, Berechtigung) VALUES ('0', 'safsaf', '7b064dad507c266a161ffc73c53dcdc5', 'asf', '0')
    Bilder
    • fehler.JPG

      60,52 kB, 482×423, 91 mal angesehen

    VB.NET-Quellcode

    1. Public Function CreateNewUser(ByVal yUserName As String, ByVal yPassword As String, ByVal yBereich As String) As Integer
    2. Dim ErrorCounter As Integer = 0
    3. Dim PW As String = ToMD5(yPassword)
    4. Dim QUery As String = "INSERT INTO Benutzer (ID, Username, Password, Bereich, Berechtigung) VALUES ('0', '" & yUserName & "', '" & PW & "', '" & yBereich & "', '0')"
    5. If conn.State = ConnectionState.Open Then
    6. conn.Close()
    7. End If
    8. Try
    9. cmd.Connection = conn
    10. conn.ConnectionString = ServerString
    11. conn.Open()
    12. cmd.CommandText = QUery
    13. cmd.ExecuteNonQuery()
    14. Catch ex As Exception
    15. ErrorCounter += 1
    16. MsgBox(ex.ToString)
    17. End Try
    18. conn.Close()
    19. Return ErrorCounter
    20. End Function
    Bilder
    • daten.JPG

      22,38 kB, 406×163, 76 mal angesehen
    Ich weiß nicht welche DB hier im Hintergrund liegt. Manche verlangen anstatt dem Hochkomma (') so ein Beistrich oben (´). Vielleicht liegt der Hund ja da begraben.
    Aber mit DB-Parametern musst du dir um solche Sachen nicht sorgen, da das Framework das für dich übernimmt.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Password ist bei vielen Datenbanktreibern ein reserviertes Schlüsselwort. Da du deine Spaltennamen aber nicht in Quotezeichen setzt, stolpert er genau darüber und bemängelt (korrekterweise) die falsche SQL-Syntax.
    Username hat vermutlich das gleiche Problem unter Access, bin mir aber grad nicht sicher.

    Setze einfach alle Feldnamen in [ und ], dann sollte der Befehl anstandslos funktionieren.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    hi probier mal das hier:

    VB.NET-Quellcode

    1. Dim conn As System.Data.OleDb.OleDbConnection
    2. Dim strSQL As String
    3. strSQL = "INSERT INTO TabelleForm27 (Bauteilart,Baustoff1,Baustoff2,Baustoff3,Baustoff4,s1,s2,s3,s4,Lambda1,Lambda2,Lambda3,Lambda4,Wärmestromrichtung,Umax,Uvor,BV,Bezeichnung) VALUES (@Bauteilart,@Baustoff1,@Baustoff2,@Baustoff3,@Baustoff4,@s1,@s2,@s3,@s4,@Lambda1,@Lambda2,@Lambda3,@Lambda4,@Wärmestromrichtung,@Umax,@Uvor,@BV,@Bezeichnung)"
    4. Dim ConnString As String
    5. Dim dt As New DataTable
    6. Dim strDB As String = IsoCalc.My.Computer.FileSystem.CurrentDirectory & "\ReportDataBase.mdb"
    7. Dim objConBuilder As New System.Data.OleDb.OleDbConnectionStringBuilder
    8. With objConBuilder
    9. .Add("Provider", "Microsoft.Jet.OLEDB.4.0")
    10. .Add("Data Source", strDB)
    11. .Add("User ID", "Admin")
    12. .Add("Password", "")
    13. End With
    14. ConnString = objConBuilder.ConnectionString
    15. conn = New System.Data.OleDb.OleDbConnection(ConnString)
    16. conn.ConnectionString = ConnString
    17. conn.Open()
    18. dt.Columns.Add("Bauteilart")
    19. dt.Columns.Add("Baustoff1")
    20. dt.Columns.Add("Baustoff2")
    21. dt.Columns.Add("Baustoff3")
    22. dt.Columns.Add("Baustoff4")
    23. dt.Columns.Add("s1")
    24. dt.Columns.Add("s2")
    25. dt.Columns.Add("s3")
    26. dt.Columns.Add("s4")
    27. dt.Columns.Add("Lambda1")
    28. dt.Columns.Add("Lambda2")
    29. dt.Columns.Add("Lambda3")
    30. dt.Columns.Add("Lambda4")
    31. dt.Columns.Add("Wärmestromrichtung")
    32. dt.Columns.Add("Umax")
    33. dt.Columns.Add("Uvor")
    34. dt.Columns.Add("BV")
    35. dt.Columns.Add("Bezeichnung")
    36. Dim cmd As System.Data.OleDb.OleDbCommand
    37. cmd = New System.Data.OleDb.OleDbCommand(strSQL, conn)
    38. cmd.Parameters.AddWithValue("@Bauteilart", Bauteilart)
    39. cmd.Parameters.AddWithValue("@Baustoff1", Baustoff1)
    40. cmd.Parameters.AddWithValue("@Baustoff2", Baustoff2)
    41. cmd.Parameters.AddWithValue("@Baustoff3", Baustoff3)
    42. cmd.Parameters.AddWithValue("@Baustoff4", Baustoff4)
    43. cmd.Parameters.AddWithValue("@s1", s1)
    44. cmd.Parameters.AddWithValue("@s2", s2)
    45. cmd.Parameters.AddWithValue("@s3", s3)
    46. cmd.Parameters.AddWithValue("@s4", s4)
    47. cmd.Parameters.AddWithValue("@Lambda1", Lambda1)
    48. cmd.Parameters.AddWithValue("@Lambda2", Lambda2)
    49. cmd.Parameters.AddWithValue("@Lambda3", Lambda3)
    50. cmd.Parameters.AddWithValue("@Lambda4", Lambda4)
    51. cmd.Parameters.AddWithValue("@Wärmestromrichtung", Wärmestromrichtung)
    52. cmd.Parameters.AddWithValue("@Umax", Umax)
    53. cmd.Parameters.AddWithValue("@Uvor", Uvor)
    54. cmd.Parameters.AddWithValue("@BV", BV)
    55. cmd.Parameters.AddWithValue("@Bezeichnung", Bezeichnung)
    56. cmd.ExecuteNonQuery()
    57. cmd.Dispose()
    58. dt.Rows.Add(Bauteilart, Baustoff1, Baustoff2, Baustoff3, Baustoff4, s1, s2, s3, s4, Lambda1, Lambda2, Lambda3, Lambda4, Wärmestromrichtung, Umax, Uvor, BV, Bezeichnung)
    59. dt.AcceptChanges()
    60. Dim dtda As System.Data.OleDb.OleDbDataAdapter
    61. dtda = New System.Data.OleDb.OleDbDataAdapter(strSQL, ConnString)
    62. dtda.Update(dt)
    63. conn.Close()


    diesen code benutze ich selbst für das füllen von tabellen in mdb z.b. für druckreporte etc. klappt bei mir prima.
    Was steht denn in yUserName, PW und yBereich drin? Sind da ggf. Sonderzeichen wie einfache oder doppelte Anführungszeichen enthalten?
    Wie sieht deine Variable Query aus, nachdem du sie zusammengebaut hast?
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    IMO sollte man sowas einfach lassen:

    VB.NET-Quellcode

    1. Dim QUery As String = "INSERT INTO Benutzer ([Username], [Password], [Bereich]) VALUES ('" & yUserName & "', '" & PW & "', '" & yBereich & "')"
    Beim String-Frickel-Ansatz tappst man von einer Fußfalle in die nächste - fängt mit ungequoteten Spaltennamen an (hamwa hier ja bereits durch), geht über vergessene Literal-Zeichen hin zu Formatierungsfehlern aufgrund der eingestellten Rechner-Sprache.
    Letztendlich aber gibts imo keinen Grund, DbParameter nicht zu verwenden, ausser man kennt diese Technologie nicht, und dann muss mans halt lernen - es ist machbar.

    Wobei dann allerdings immer noch abstürzen kann, wenn die DBParameter nicht den richtigen Datentyp transportieren, aber zumindest ist ausgeschlossen, dass in den Variablen Textwerte stehen, die vonne DB als Sql ausgewertet werden (Absturz-Ursache aus Versehen oder gar gezielter Sql-Injection-Angriff).
    Richtige Typisierung ist immer ein KernThema der Programmierung - auch hier mit die DbParameter - und wenn man inne Datenbank Datumse als Strings speichert - das rächt sich ganz unausweichlich, meist bereits mittelfristig.

    DbParameter sind aber noch nicht das Ende der Fahnenstange - noch weiter vorzuziehen sind DbDataAdapter - hier hat man die 4 CRUD - Concerns in einem Objekt beisammen.
    Und noch weiter gehts, wenn man dem Adapter einen CommandBuilder aufsetzt, der anhand des Select-Statements die anderen 3 Commands automatisch generiert und konfiguriert, inklusive korrekt gewählter DbParameter.
    guck - hier habich ein CommandBuilderSample, wenn meine Link-Sammlung mich nicht trügt.

    Also ist nicht einfach, aber machbar, DB-Zugriffe zu proggen, ohne von einer Fußfalle in die nächste zu stapfen.
    (naja - bleiben noch genügend Fallen übrig) ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()