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

... komplette Frage anzeigen

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

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...

Antwort bewerten Vielen Dank für Deine Bewertung

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.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Justin2506
16.05.2016, 17:37

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

0

Ohne Code wird das schwierig.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Justin2506
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