我有一个类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
的值,并且它(使用监视程序)和CommandText
仍显示为"SELECT @idField, @valueField FROM @databaseTable ORDER BY @valueField"
-所以我不确定如何检查语法中是否有任何明显的错误,因为我通常会做。我发现根据this answer,这显然是不可能的。
有没有一种方法可以查看包含所包含值的实际
CommandText
以便诊断语法错误?如果确实无法使用参数化查询,是否有一种安全的方法来指定表名?
最佳答案
尝试为您的组合框创建一个通用表:[id,value,combo],然后将组合元数据添加到其他表。
或者只是使用存储库模式:)
关于c# - 由于似乎无法在参数化查询中指定表的名称,是否有安全的替代方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26633488/