【问题标题】:No value given for one or more required parameters c#没有为一个或多个必需参数提供值c#
【发布时间】:2015-05-07 10:24:18
【问题描述】:

当我想在 C# 应用程序中执行我的 SQL 语句时出现错误,它是:

没有为一个或多个必需参数指定值。

我正在使用带有 MS 访问数据库的 c#。 这是我的代码:

string string2 = "";

if (radButton2 != null)
{
     string2 = " and signaal1.info='" + radButton2.Text + "' ";
}
else
     string2 = " and signaal1.info='0' ";
if (radButton3 != null)
{
     string2 += " and situation.info='" + radButton3.Text + "' ";
}
OleDbCommand cmd = new OleDbCommand("SELECT actionz.info, relationz.id AS actionz FROM ((((relationz LEFT OUTER JOIN conditions ON relationz.conditions_id = conditions.id) LEFT OUTER JOIN situation ON relationz.situation_id = situation.id) LEFT OUTER JOIN car_type ON relationz.car_id = car_type.id) LEFT OUTER JOIN actionz ON relationz.action_id = actionz.id) LEFT OUTER JOIN signal AS signaal1 ON relationz.signal_id = signaal1.id where car_type.info='" + radButton1.Text + "' " + string2 + "  ORDER BY conditions.id ASC", objConn);
//cmd.Parameters.AddWithValue("@car_type", radButton1.Text);

OleDbDataReader dataReader = cmd.ExecuteReader();

【问题讨论】:

  • 当您添加字符串值时,您的cmd 是什么样的?就在OleDbDataReader dataReader = cmd.ExecuteReader(); 行之前?调试您的代码并告诉我们。而且您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。
  • 你应该调试实际的查询字符串,然后你可以看到你的查询出了什么问题。
  • 我把它当作一个笔记!,我手动添加:car_type.info=' " + radButton1.Text + " ' "
  • 总是建议先创建你的sql语句,然后将它传递给一些函数。这样你就可以很容易地记录下 sql 语句,看看它是否真的是一个有效的语句。

标签: c# sql ms-access


【解决方案1】:

错别字:

" ...info='" + radButton1.Text + "' " + string2 + "  ORDER BY ..."

应该是

" ...info='" + radButton1.Text + string2 + "'  ORDER BY ..."

或者如果您需要值之间的空格:

" ...info='" + radButton1.Text + " " + string2 + "'  ORDER BY ..."

尽管如前所述,但可以进行注入。

【讨论】:

  • 不,怎么样!! "info='" + radButton1.Text + string2 + "' ORDER BY" !我在 if 语句之前添加了单引号!
  • " 之前的 info 只是为了在堆栈溢出中正确显示。我的朋友,这里不需要感叹号。
  • 单引号是问题所在。尤其是这里:string2 = " and signaal1.info='0' "; 你需要使用参数化查询。
  • 我删除了所有这部分并删除了“+ string2 +”部分,出现同样的错误
  • 试试这个查询字符串。在我有 EnterSomeValueHerecare_type.info 列中输入您希望出现的值。 "SELECT actionz.info, relationz.id AS actionz FROM ((((relationz LEFT OUTER JOIN conditions ON relationz.conditions_id = conditions.id) LEFT OUTER JOIN situation ON relationz.situation_id = situation.id) LEFT OUTER JOIN car_type ON relationz.car_id = car_type.id) LEFT OUTER JOIN actionz ON relationz.action_id = actionz.id) LEFT OUTER JOIN signal AS signaal1 ON relationz.signal_id = signaal1.id where car_type.info='EnterSomeValueHere' ORDER BY conditions.id ASC"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多