Syntaxfehler wegen Hochkomma

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Syntaxfehler wegen Hochkomma

    Also mein Problem ist folgendes, ich versuche aus meinem Musik Ordner die Einzelnen Lieder in eine Access DB einzubinden.
    Nun erhalte ich immer ein Syntaxfehler beim der Insert into SQL Befel.
    Das Problem taucht nur auf wenn ein Value ein ' (Hochkomma) beinhaltet.
    Hier noch mein Quell Code

    VB.NET-Quellcode

    1. Private Sub Menuform_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    2. Dim sFile As String
    3. Dim sPath As String = "C:\Users\Public\Music\Adele\"
    4. 'Anzahl der Dateien
    5. Dim counter = My.Computer.FileSystem.GetFiles( _
    6. sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.mp3").Count + My.Computer.FileSystem.GetFiles( _
    7. sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.wma").Count
    8. '--------------------------------------------------------------------------------------------------------------------
    9. 'Initialisiere Access DB
    10. '--------------------------------------------------------------------------------------------------------------------
    11. Dim con As New OleDbConnection
    12. Dim cmd As New OleDbCommand
    13. con.ConnectionString =
    14. "Provider=Microsoft.ACE.OLEDB.12.0;" &
    15. "Data Source= C:\Users\Jonas\Documents\Visual Studio 2010\Projects\Mediaplayer\Mediaplayer\Mediaplayer\dateien\Musikbibliothek.accdb"
    16. cmd.Connection = con
    17. '---------------------------------------------------------------------------------------------------------------------
    18. ' alle Dateien im Pfad sPath Verzeichnis einschl. Unterordner
    19. Try
    20. con.Open()
    21. For Each sFile In My.Computer.FileSystem.GetFiles( _
    22. sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.mp3")
    23. Dim MP3file As New ID3TagLibrary.MP3File(sFile)
    24. cmd.CommandText = "insert into Bibliothek (Titel, Pfad) values ('" & MP3file.Title & " ', '" & sFile & "')"
    25. cmd.ExecuteNonQuery()
    26. Next
    27. con.Close()
    28. Catch ex As Exception
    29. MessageBox.Show(ex.Message)
    30. End Try
    31. End Sub
    32. End Class

    Was kann ich nun tun um diesen Fehler zu umgehen?

    MioStarkid schrieb:

    Auf was möchtest du mich hinweisen?

    Vornehm ausgedrückt, dass dein INSERT Statement Sch... ist. Und weil es Sch.. ist, bekommst du nen SQL-Fehler. Folgetest du dem Link, läsestest du was dort steht und wendestest du es an, wäre dein Syntaxfehler weg (weil dann nämlich der "Datenbank-Treiber" sich drum kümmert, illegale Zeichen zu escapen etc).


    VB.NET-Quellcode

    1. Dim cmd As New OleDb.OleDbCommand("INSERT INTO foo (Textfeld, Zahlfeld, Datumfeld) VALUES (?, ?, ?)")
    2. cmd.Parameters.AddWithValue("BeiAccessEgal1", "A")
    3. cmd.Parameters.AddWithValue("BeiAccessEgal2", 1)
    4. cmd.Parameters.AddWithValue("BeiAccessEgal3", Now)
    Hmm...Danke für die Hilfe... Jetzt fügt das Statement leider immer nur den gleichen Datensatz ein. Keine Ahnung wieso aber ich habe immer nur das gleiche Lied in der DB
    Erstaunlicherweise 17 mal das gleiche. Welches auch die Anzahl der vorhandenen Lieder ist. Folgedessen führt er die For Each schlaufe durch aber er ändert die Daten im insert into statement nicht mehr.

    Gibt es vielleicht auch da eine Zauberlösung?

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class Menuform
    3. Private Sub Menuform_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    4. Dim sFile As String
    5. Dim sPath As String = "C:\Users\Public\Music\Adele\"
    6. Dim counter = My.Computer.FileSystem.GetFiles( _
    7. sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.mp3").Count + My.Computer.FileSystem.GetFiles( _
    8. sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.wma").Count
    9. '--------------------------------------------------------------------------------------------------------------------
    10. 'Initialisiere Access DB
    11. '--------------------------------------------------------------------------------------------------------------------
    12. Dim con As New OleDbConnection
    13. Dim cmd As New OleDbCommand
    14. 'Dim reader As OleDbDataReader
    15. con.ConnectionString =
    16. "Provider=Microsoft.ACE.OLEDB.12.0;" &
    17. "Data Source= C:\Users\Jonas\Documents\Visual Studio 2010\Projects\Mediaplayer\Mediaplayer\Mediaplayer\dateien\Musikbibliothek.accdb"
    18. cmd.Connection = con
    19. '---------------------------------------------------------------------------------------------------------------------
    20. ' MsgBox(counter)
    21. ' alle Dateien im Pfad sPath Verzeichnis einschl. Unterordner
    22. ' in einer ListBox anzeigen
    23. Try
    24. con.Open()
    25. For Each sFile In My.Computer.FileSystem.GetFiles( _
    26. sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.mp3")
    27. Dim mp3info As New ID3TagLibrary.MP3File(sFile)
    28. cmd.CommandText = "INSERT INTO Bibliothek (Titel, Album, Interpret, Pfad) VALUES (?, ?, ?, ?)"
    29. cmd.Parameters.AddWithValue("Titel", mp3info.Title)
    30. cmd.Parameters.AddWithValue("Album", mp3info.Album)
    31. cmd.Parameters.AddWithValue("Interpret", mp3info.Artist)
    32. cmd.Parameters.AddWithValue("Pfad", sFile)
    33. cmd.ExecuteNonQuery()
    34. Next
    35. con.Close()
    36. Catch ex As Exception
    37. MessageBox.Show(ex.Message)
    38. End Try
    39. End Sub
    40. End Class

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

    MioStarkid schrieb:

    Erstaunlicherweise 17 mal das gleiche.

    Gnampf!!!!

    VB.NET-Quellcode

    1. Dim cmd As New OleDb.OleDbCommand("INSERT INTO foo (Zahlfeld) VALUES (?)")
    2. cmd.Parameters.Add("DieZahl", OleDb.OleDbType.Integer)
    3. For i = 1 To 10
    4. cmd.Parameters("DieZahl").Value = i
    5. cmd.ExecuteNonQuery()
    6. Next


    Na? Groschen fällt?

    PS: Mach mal vor con.close ein: Debug.print(cmd.parameters.count)
    Es geht nicht um den Datentyp, sondern um die Art des Aufrufs.
    Du kannst Parameter adden soviel du willst, er nimmt bei dem von dir vorgegebenen SqlCommand immer nur die ersten vier.

    Bei deiner Methode mit jedesmal neu adden müsstest du vorher clearen.

    Aber die Variante von picoflop ist besser:
    Vor der Schleife adden und in der Schleife den Wert jeweils neu setzen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Erst mal danke für deine Erklärung.
    Leider kann ich den OleDb.OleDbType nicht in ein String ändern.

    VB.NET-Quellcode

    1. Dm sFile As String
    2. Dim cmd As New OleDb.OleDbCommand("INSERT INTO foo (Textfeld) VALUES (?)")
    3. cmd.Parameters.Add("Text", OleDb.OleDbType.String)
    4. For i = 1 To 10
    5. cmd.Parameters("Text").Value = sFile
    6. cmd.ExecuteNonQuery()
    7. Next


    Ich weiss in diesem Beispiel ist ja der String sFile immer gleich.
    Dies spielt aber keine Rolle, stell dir einfach vor er verändert sich.
    Die Kernaussage ist das dieses Beispiel nicht funktioniert.
    Da es kein 'OleDb.OleDbType.String'.
    Also wie soll ich einen String übergeben können?
    Danke für eure Hilfe