我有一个类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/

10-11 11:30