这是一个类的代码:
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服务器版本对应的手册,以便在''Client''附近使用正确的语法第1行“。
任何线索如何解决这个问题,同时仍然使用参数化的MySqlCommand?
答案 0 :(得分:3)
参数不能用于表示表名或字段名。它们只能用于表示WHERE条件中的值或在INSERT或UPDATE查询中插入/更新值。
在这种情况下,除了恢复字符串连接之外别无选择 请确保您不允许用户键入表名,但只能从预定义的名称列表中选择
Private Sub LoadTable(table as String)
dt.Dispose()
dt = SQL.ExecuteCommand("SELECT * FROM " & table)
command.Dispose()
End Sub
我还更改了你的ExecuteCommand以接收字符串而不是命令。在我看来,这会将所有一次性对象集中在ExecuteCommand方法中,通过使用语句可以轻松初始化和处理它们
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