SQL: Was bedeutet die Fehlermeldung "Falsche Syntax in der Nähe des User-Schlüsselworts" bei einer Abfrage?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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":

https://goo.gl/2Ux1Yp

---------------------------

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]")


HIER IST ES ZWINGEND: [eckige Klammern] um [username] und [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.

Justin2506 
Fragesteller
 16.05.2016, 17:37

Das funktionier auch nicht... Dann kommt die Meldung: Falsche Syntax in der Nähe von ´´

0
mastema666  16.05.2016, 17:51
@Justin2506

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.

0

Ohne Code wird das schwierig.

Justin2506 
Fragesteller
 16.05.2016, 17:21
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
0