我正在尝试做类似这样的事情:
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表单中的文本框中获取字段名称(数据库)和值。但结果并不好。你能告诉我我做错了什么吗?没有任何错误或任何错误。
提前致谢。
答案 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);