由于在参数化查询中似乎不可能指定表的名称,因此有安全的替代方法吗
本文关键字:安全 方法 查询 参数 不可能 | 更新日期: 2023-09-27 18:28:13
我有一个类ValuesField
,它管理组合框的值。
构造函数指定一个可以从中检索值的数据库表,以及从中检索SELECT
数据的两个字段。
public ValuesField(string databaseTable, string idField, string valueField)
{
this.databaseTable = databaseTable;
this.idField = idField;
this.valueField = valueField;
}
我的方法GetValues()
检索这些数据(然后可以从中填充ComboBox)。我将CommandText
构造为一个简单的字符串,但是为了安全起见,我希望使用参数化查询。
简单的字符串命令-
dbCommand.CommandText = "SELECT " + idField + "," + valueField + " FROM " +
databaseTable + " ORDER BY " + valueField;
参数化查询-
dbCommand.CommandText = "SELECT @idField, @valueField FROM @databaseTable
ORDER BY @valueField";
dbCommand.Parameters.AddWithValue("@idField", idField);
dbCommand.Parameters.AddWithValue("@valueField", valueField);
dbCommand.Parameters.AddWithValue("@databaseTable", databaseTable);
dbReader = dbCommand.ExecuteReader();
参数化查询在ExecuteReader()
上抛出一个MySqlException
,并显示消息"您的SQL语法有错误"。
我在抛出Exception时检查了
CommandText
的值,它(使用Watch)和CommandText
仍然显示为"SELECT @idField, @valueField FROM @databaseTable ORDER BY @valueField"
,所以我不知道如何像往常一样检查语法中是否有任何明显的错误根据这个答案,我认为这显然是不可能的。
是否有一种方法可以查看包含值的实际CommandText
,以诊断语法错误?
如果确实无法使用参数化查询,是否有一种安全的替代方法来指定表名?
尝试为组合框创建一个通用表:[id,value,combo],并将组合元数据添加到其他表中。
或者只使用存储库模式:)