【问题标题】:Must declare a scalar variable.?必须声明一个标量变量。?
【发布时间】:2014-09-27 10:13:02
【问题描述】:

我必须使用 ajax 扩展工具显示条形图。当我从下拉列表中选择一个值时,我必须在图表上显示信息。但它显示“必须声明一个标量变量”错误。请帮我。 代码:

  protected void Page_Load(object sender, EventArgs e)
    {
              if (!IsPostBack)
        {
            string query = "select Name from aTable";
            DataTable dt = GetData(query);
            ddlCountries.DataSource = dt;
            ddlCountries.DataTextField = "Name";
            ddlCountries.DataValueField = "Name";
            ddlCountries.DataBind();
            ddlCountries.Items.Insert(0, new ListItem("Select", ""));
        }

    }

    private DataTable GetData(string query)
    {
        DataTable dt = new DataTable();
        string constr = ConfigurationManager.ConnectionStrings["demoConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand(query))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    sda.Fill(dt);
                }
            }
            return dt;
        }
    }
    protected void ddlCountries_SelectedIndexChanged(object sender, EventArgs e)
    {
        string query = string.Format("select Debit, Credit, Year From aTable where Name=@Name", ddlCountries.SelectedItem.Value);
        DataTable dt = GetData(query);

        string[] x = new string[dt.Rows.Count];
        decimal[] y = new decimal[dt.Rows.Count];
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            x[i] = dt.Rows[i][0].ToString();
            y[i] = Convert.ToInt32(dt.Rows[i][1]);
        }
        BarChart1.Series.Add(new AjaxControlToolkit.BarChartSeries { Data = y });
        BarChart1.CategoriesAxis = string.Join(",", x);
        BarChart1.ChartTitle = string.Format("{0} Order Distribution", ddlCountries.SelectedItem.Value);
        if (x.Length > 3)
        {
            BarChart1.ChartWidth = (x.Length * 100).ToString();
        }
        BarChart1.Visible = ddlCountries.SelectedItem.Value != "";
    }

【问题讨论】:

  • 包括完整的异常消息/失败指示符,包括相关的行号和/或即时堆栈跟踪。

标签: c# sql asp.net database charts


【解决方案1】:

在这一行

string query = string.Format(@"select Debit, Credit, Year 
                             From aTable where Name=@Name", 
                             ddlCountries.SelectedItem.Value);

您有一个参数占位符@Name,但您没有将所需的参数添加到执行 sql 的 SqlCommand 中。这会产生您看到的错误。
(顺便说一句,string.Format 需要 {0} 形式的占位符,但如果你解决了这个问题,它仍然是错误的,因为你为 Sql Injection 敞开了大门)

修复它需要更改您的 GetData 函数。
您需要添加一个(可选)参数数组作为另一个参数

private DataTable GetData(string query, SqlParameter[] prms = null)
{
    DataTable dt = new DataTable();
    string constr = ConfigurationManager.ConnectionStrings["demoConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand(query))
        {
            if(prms != null)
                cmd.Parameters.AddRange(prms);

            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.CommandType = CommandType.Text;
                cmd.Connection = con;
                sda.SelectCommand = cmd;
                sda.Fill(dt);
            }
        }
        return dt;
    }
}

现在,当您调用该方法时,您可以编写

string query = "select Debit, Credit, [Year] From aTable where Name=@Name";
SqlParameter[] prms = new SqlParameter[1];
prms[0] = new SqlParameter("@Name", SqlDbType.NVarChar).Value = 
                          ddlCountries.SelectedItem.Value.ToString());
DataTable dt = GetData(query, prms);

还请注意,我已将字段 Year 放在方括号中。年份是 T-SQL 函数的名称,你应该使用这个技巧来避免混淆 SQL 解析器

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多