SQL: Was bedeutet die Fehlermeldung "Falsche Syntax in der Nähe des User-Schlüsselworts" bei einer Abfrage?
Ich programmiere zur Zeit eine Leitstelle für mein Funkspiel. Das ganze möchte ich mit einer SQL Query machen.
Jetzt bekomme ich aber die Fehlermeldung: Falsche Syntax in der Nähe des User-Schlüsselworts. Kann mir jemand erklären, warum die Meldung kommt?
3 Antworten
falsche Syntax in der Nähe des User-Schlüsselworts.
Diese Meldung ist typisch, wenn die Datenbank-Verbindung deine [User]-Tabelle nicht oder nicht schnell genug finden kann. Dann versucht der SQL-Interpreter deine Forderung, dass von "User selektiert werden soll", trotzdem zu erfüllen. Dazu interpretiert er das "Objekt [User]" als "Schlüsselwort User". Und das kann nicht funktionieren; denn vom Schlüsselwort kann nicht selektiert werden.
Versuche, solche Fehler zu vermeiden, indem du die reservierten Keywords nicht in deinen Tabellen (weder als Spaltenname, noch als Tabellenname) benutzt.
Hier findest du eine Liste der "reservierten Keywords":
---------------------------
Vorbereitung: Prüfe, ob die Datenbank-Verbindung überhaupt zur richtigen Datenbank verbindet. Prüfe dann, ob die Datenbank wirklich eine Tabelle namens "User" enthält. Und prüfe zum Schluss, ob die Tabelle [User] eine Spalte mit dem Namen "Username" hat. (Es müssen keine Werte drinstehen. Es reicht, wenn beides existiert.)
Besserer Weg: Wenn alles vorhanden ist, ändere sicherheitshalber den Namen der Tabelle auf [User_1] oder [Benutzer] oder so. Korrigiere dann die folgende Zeile:
SQL.RunQuery("SELECT username FROM User")
in
SQL.RunQuery("SELECT [username] FROM [User_1]")
und teste, ob es jetzt funktioniert. (Die eckigen Klammern geben dem Interpreter die Zwangsvorgabe: "Das ist ein Name. Nix anderes. Auch kein Keyword. Also versuche gar nicht erst, klüger als ich sein zu wollen und irgendwas anders zu interpretieren, als ich es dir sage.")
Schlechterer Weg: Wenn du die Tabelle User nicht mehr umbenennen kannst, dann korrigiere mindestens die Zeile wie folgt:
SQL.RunQuery("SELECT [username] FROM [User]")
Das wird funktionieren, ist aber ein miserabler Workaround, der dir bei komplexeren Aufgaben auf die Füße fallen kann.
----------------------------
Du wirst mindestens eine andere Fehlermeldung bekommen, die dich auf eine bessere Spur schickt. Aber wenn die Datenbank-Verbindung stimmt und die Tabelle existiert, sollte die Fehlermeldung ganz weg sein und stattdessen ein Ergebnis zurückkommen...
Die Sprache (VB) kenne ich zwar selbst nicht wirklich, aber "user" ist ein "reserviertes" SQL-Schlüsselwort, d.h. du kannst zwar deine Tabelle trotzdem so nennen, musst das Wort aber in Backticks setzen, damit das nicht als SQL Schlüsselwort statt als Tabellenname interpretiert wird.
Hmm, was für eine DB nutzt du denn?
Die Lösung mit den Backticks sollte für MySQL auf jeden Fall funktionieren.
Hab grad mal kurz gegoogelt, in MS SQL z.B. setzt man solche Worte stattdessen offenbar in eckige Klammern, mag also bei weiteren DB Systemen nochmal anders sein, ggf einfach mal Google fragen wie man das bei dem von dir genutzten macht.
Ohne Code wird das schwierig.
Imports System.Data.Sql
Imports System.Data.SqlClient
Public Class SQLControl
Public SQLCon As New SqlConnection With {.ConnectionString = "Server=85.214.193.212\SQLEXPRESS;Database=MO-Leit;User=sa;Pwd=F85pUSwY;"}
Public SQLCmd As SqlCommand
Public SQLDA As SqlDataAdapter
Public SQLDataset As DataSet
Public Function HasConnection() As Boolean
Try
SQLCon.Open()
SQLCon.Close()
Return True
Catch ex As Exception
MsgBox(ex.Message)
Return False
End Try
End Function
Public Sub RunQuery(Query As String)
Try
SQLCon.Open()
SQLCmd = New SqlCommand(Query, SQLCon)
'Load SQL Record for Datagrid
SQLDA = New SqlDataAdapter(SQLCmd)
SQLDataset = New DataSet
SQLDA.Fill(SQLDataset)
' Direkt aus DB lesen
Dim R As SqlDataReader = SQLCmd.ExecuteReader
While R.Read
MsgBox(R.GetName(0) & ": " & R(0))
End While
SQLCon.Close()
Catch ex As Exception
MsgBox(ex.Message)
If SQLCon.State = ConnectionState.Open Then
SQLCon.Close()
End If
End Try
End Sub
End Class
Public Class LoginForm1
Dim SQL As New SQLControl
Private Sub LoginForm1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
If SQL.HasConnection = True Then
SQL.RunQuery("SELECT username FROM User")
Else
End If
End Sub
Private Sub RunQuery_Click(sender As Object, e As EventArgs) Handles RunQuery.Click
If SQL.HasConnection = True Then
SQL.RunQuery(txtQuery.Text)
If SQL.SQLDataset.Tables.Count > 0 Then
DGVData.DataSource = SQL.SQLDataset.Tables(0)
End If
End If
End Sub
End Class
Das funktionier auch nicht... Dann kommt die Meldung: Falsche Syntax in der Nähe von ´´