C# 必须声明标量变量。?

C# 必须声明标量变量。?,c#,sql,asp.net,database,charts,C#,Sql,Asp.net,Database,Charts,我必须使用ajax extender工具显示条形图。当我从下拉列表中选择一个值时,我必须在图表上显示信息。但它显示了“必须声明标量变量”错误。请帮帮我。 代码: 受保护的无效页面加载(对象发送方,事件参数e) { 如果(!IsPostBack) { string query=“从aTable中选择名称”; DataTable dt=GetData(查询); ddlCountries.DataSource=dt; ddlCountries.DataTextField=“Name”; ddldcou

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

受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!IsPostBack)
{
string query=“从aTable中选择名称”;
DataTable dt=GetData(查询);
ddlCountries.DataSource=dt;
ddlCountries.DataTextField=“Name”;
ddldcountries.DataValueField=“Name”;
ddl.DataBind();
ddlCountries.Items.Insert(0,新列表项(“选择”);
}
}
私有数据表GetData(字符串查询)
{
DataTable dt=新的DataTable();
string constr=ConfigurationManager.ConnectionString[“demoConnectionString”].ConnectionString;
使用(SqlConnection con=newsqlconnection(cont))
{
使用(SqlCommand cmd=newsqlcommand(query))
{
使用(SqlDataAdapter sda=newsqldataadapter())
{
cmd.CommandType=CommandType.Text;
cmd.Connection=con;
sda.SelectCommand=cmd;
sda.填充(dt);
}
}
返回dt;
}
}
受保护的无效DDL\u选择的索引已更改(对象发送方,事件参数e)
{
string query=string.Format(“选择借方、贷方、从数据表开始的年份,其中Name=@Name”,ddlCountries.SelectedItem.Value);
DataTable dt=GetData(查询);
字符串[]x=新字符串[dt.Rows.Count];
十进制[]y=新的十进制[dt.Rows.Count];
对于(int i=0;i3)
{
BarChart1.ChartWidth=(x.Length*100).ToString();
}
BarChart1.Visible=ddlCountries.SelectedItem.Value!=“”;
}
在这行中

string query = string.Format(@"select Debit, Credit, Year 
                             From aTable where Name=@Name", 
                             ddlCountries.SelectedItem.Value);
您有一个参数占位符
@Name
,但没有将所需的参数添加到执行sql的SqlCommand中。这将产生您看到的错误。
(顺便说一下,string.Format需要{0}格式的占位符,但是如果您解决了这个问题,它仍然是错误的,因为您为Sql注入敞开了大门)

修复它需要更改
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放在方括号之间。Year是T-SQL函数的名称,您应该使用此技巧避免混淆SQL解析器

包括完整的异常消息/故障指示器,包括相关的行号和/或即时堆栈跟踪。
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);