这是一个类的代码:
Private Sub LoadTable()
dt.Dispose()
command.CommandText = "SELECT * FROM @TableName"
command.Parameters.Add(New MySqlParameter("TableName", TableName))
dt = SQL.ExecuteCommand(command)
command.Dispose()
End Sub
这是来自另一个类的代码,上面的代码调用了它:
Public Function ExecuteCommand(ByVal Command As MySqlCommand)
Dim dt As New DataTable
Dim da As New MySqlDataAdapter
Dim con As New MySqlConnection
con.ConnectionString = GetConnectionString
Command.Connection = con
con.Open()
da.SelectCommand = Command
da.Fill(dt)
con.Close()
con.Dispose()
da.Dispose()
Return dt
End Function
变量 TableName 等于字符串 Client。
语法是有效的,因为我已经在 MySQL Workbench 中尝试过它,如果我在未参数化的情况下尝试它,它会起作用。
我得到的错误是语法无效:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解在“客户端”附近使用的正确语法,位于第 1 行”。
任何线索如何解决这个问题,同时仍然使用参数化的 MySqlCommand?
最佳答案
参数不能用于表示表名或字段名。它们只能用于表示 WHERE 条件中的值或在 INSERT 或 UPDATE 查询中插入/更新值。
在这种情况下,您别无选择,只能恢复到字符串连接。
请确保您不允许您的用户键入表名,而只能从预定义的众所周知的名称列表中选择它
Private Sub LoadTable(table as String)
dt.Dispose()
dt = SQL.ExecuteCommand("SELECT * FROM " & table)
command.Dispose()
End Sub
我还更改了您的 ExecuteCommand 以接收字符串而不是命令。在我看来,这将您所有的一次性对象都集中在 ExecuteCommand 方法中,在那里它们可以通过 Using 语句轻松初始化和处理
Public Function ExecuteCommand(cmdText as String)
Dim dt As New DataTable
Using con = New MySqlConnection(GetConnectionString())
Using command = new MySqlCommand(cmdText, con)
con.Open()
Using da = new MySqlDataAdapter(command)
da.Fill(dt)
End Using
End Using
End Using
Return dt
End Function
关于mysql - 使用参数时出现 SQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181579/