由于似乎无法在参数化查询中指定表的名称,是否有安全的替代方案?

时间:2014-10-29 14:50:55

标签: c# mysql sql

我有一个类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以诊断语法错误?

如果确实不能使用参数化查询,是否有指定表名的安全替代方法?

1 个答案:

答案 0 :(得分:0)

尝试为组合框创建通用表:[id,value,combo]并将组合元数据添加到其他表中。

或者只使用存储库模式:)