运行具有可变属性名称的查询

时间:2014-04-08 13:28:48

标签: c# ms-access oledb

我正在尝试做类似这样的事情:

adp.SelectCommand.CommandText = "select * from table1 where @1=@2 and @3=@4";
adp.SelectCommand.Parameters.AddWithValue("@1", textBox1.Text);
adp.SelectCommand.Parameters.AddWithValue("@2", textBox2.Text);

我认为我很清楚我想做什么。我想要从win表单中的文本框中获取字段名称(数据库)和值。但结果并不好。你能告诉我我做错了什么吗?没有任何错误或任何错误。

提前致谢。

2 个答案:

答案 0 :(得分:1)

只有值才被视为查询中的参数。 您引用的属性绝不是参数。 这是SQL和许多其他查询语言实现的基本规则。

但您可以围绕此约束进行编码,如下所示。

请注意,实际的属性名称绝不应来自外部(用户或数据库),但出于安全原因需要进行硬编码。不这样做可能会使您暴露于SQL注入和类似的攻击。<​​/ p>

总结:

  • 值是参数
  • 属性是硬编码的

这是您应该适应问题的源代码:

QueryCase querycase;
string querytext, attributeName1, attributeName2;

querycase = QueryCase.Alpha; // switch between possible queries

// somewhere later in your code...

switch (querycase)
{
    case QueryCase.Alpha:
        attributeName1 = "attribute1";
        attributeName2 = "attribute2";
    case QueryCase.Beta:
        attributeName1 = "attribute3";
        attributeName2 = "attribute4";
    default:
        throw new NotImplementedException(string.Format("unrecognized query case (was {0})", (int)querycase));
}

querytext = string.Format("select * from table1 where {0}=@1 and {1}=@2", attributeName1, attributeName2);

adp.SelectCommand.CommandText = querytext;

此处querycase是硬编码的enum,因此您无法设置任意属性名称:

enum QueryCase
{
    Alpha,
    Beta
}

答案 1 :(得分:0)

比较2个参数时没有结果,您的代码必须是:

adp.SelectCommand.CommandText = "select * from table1 where ColumnName1=@1 and ColumnName2=@2";
adp.SelectCommand.Parameters.AddWithValue("@1", textBox1.Text);
adp.SelectCommand.Parameters.AddWithValue("@2", textBox2.Text);