【问题标题】:No value given for one or more required parameters when Changing DropDownlist更改 DropDownlist 时没有为一个或多个必需参数指定值
【发布时间】:2015-05-19 12:27:35
【问题描述】:

共有两个下拉菜单

从数据库中获取值,例如:

下拉 1(产品)

  • 冰淇淋
  • 巧克力
  • 冷饮

如果从第一个下拉列表 1 中选择冰淇淋,它将显示

下拉2(品种)

  • 香草
  • 草莓
  • 芒果

如果从第一个下拉列表 1 中选择了 Chocolates,它将显示

下拉2(品种)

  • 黑巧克力
  • 牛奶巧克力
  • 焦糖巧克力

其他项目应清除并仅显示以上内容


使用的代码

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    string txtval = DropDownList1.SelectedValue;
    string txtval1 = DropDownList1.SelectedItem.Text;

    string str = "Provider=Microsoft.ACE.OleDB.12.0; Data Source=C:\\Users\\user\\Desktop\123\\WebSite1\\Checking_Db.mdb";
    OleDbConnection db = new OleDbConnection(str);
    db.Open();                                    
    //  string st = "select Emp_Ph_No from emp where Emp_Name =  DropDownList1.SelectedValue ;";

    string st = "select Emp_Ph_No from emp where Emp_Name = txtval1;";

    OleDbCommand dbc = new OleDbCommand(st, db);
    OleDbDataReader read = dbc.ExecuteReader();

    DropDownList2.DataSource = read;
    DropDownList2.DataTextField = "variety";       
    DropDownList2.DataValueField = ""variety";       
    DropDownList2.DataBind();
    read.Close();
    db.Close();
}

【问题讨论】:

  • 确定此代码会导致该错误吗?我在您的 SQL 中没有看到任何实际参数,但我确实看到了一个语法错误,您尝试在字符串中使用 C# 变量。
  • 如果我这样使用意味着 string st = "select Emp_Ph_No from emp where Emp_Name = DropDownList1.SelectedValue ;";
  • 这仍然是一个语法错误。您不能在这样的字符串中使用变量。 (您也不应该使用 SQL 语句,这将是一个 SQL 注入漏洞。)下面 Soner 的回答显示了如何将值添加到 SQL 语句。
  • 通过断点检查 Getting txtval =2 and txtval 1= Ice Cream 但它会产生错误
  • 我不知道还能如何描述这一点。您从根本上误解了 C# 和 SQL 的工作原理。老实说,我建议浏览一些关于该主题的介绍性教程。

标签: c# asp.net


【解决方案1】:

那条线上的问题;

...where Emp_Name = txtval1;

如果txtval1string,您将使用它作为Emp_Name = 'txtval1'。这不是有效的语法。在这种情况下,OLEDB 提供商认为这个txtval1 是一个参数,而您没有为此提供任何值。

您可以将此值设置为参数并添加到您的命令中,例如;

string st = "select Emp_Ph_No from emp where Emp_Name = ?";
OleDbCommand dbc = new OleDbCommand(st, db);
dbc.Parameters.AddWithValue("?", txtval1);

我在示例中使用了AddWithValue,但你没有This method may generate unexpected results sometimes。使用.Add() 重载来指定您的参数OleDbType 及其大小。

还可以使用using statement 自动处理您的连接、命令和阅读器,而不是手动调用.Close.Dispose 方法。

using(var db = new OleDbConnection(str))
using(var dbc = db.CreateCommand)
{
    // Set your CommandText.
    // Add your parameter value.

    using(var read = dbc.ExecuteReader())
    {
       //
    }
}

【讨论】:

  • 工作!!谢谢你的帮助。用 .Add() 修改了这个语言的新手非常非常感谢太好了!
猜你喜欢
  • 2011-01-23
  • 2017-12-25
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多