我有一个类ValuesField
,它管理ComboBoxes的值。
构造函数指定可以从中检索值的数据库表,以及从中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();
参数化查询会在MySqlException
上弹出ExecuteReader()
消息'您的SQL语法中出现错误'。
我检查了异常被抛出的CommandText
的值,并且(使用Watch)和CommandText
仍显示为"SELECT @idField, @valueField FROM @databaseTable ORDER BY @valueField"
- 所以我是不知道如何检查任何明显错误的语法,就像我通常做的那样。
根据this answer,我发现这显然是不可能的。
有没有办法查看包含值的实际CommandText
以诊断语法错误?
如果确实不能使用参数化查询,是否有指定表名的安全替代方法?
答案 0 :(得分:0)
尝试为组合框创建通用表:[id,value,combo]并将组合元数据添加到其他表中。
或者只使用存储库模式:)