2014-09-27 12 views
0

Мне нужно отобразить гистограмму с помощью инструмента расширения 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 [email protected]", 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 != ""; 
    } 
+2

Включите полный индикатор сообщения о сбоях/сбоях, включая соответствующий номер строки и/или прямую трассировку стека. – user2864740

ответ

2

В этой строке

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

у вас есть параметр-заполнитель @Name, но вы не добавляете нужный параметр в SqlCommand, который выполняет SQL. Это вызывает ошибку, которую вы видите.
(кстати, 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 [email protected]"; 
SqlParameter[] prms = new SqlParameter[1]; 
prms[0] = new SqlParameter("@Name", SqlDbType.NVarChar).Value = 
          ddlCountries.SelectedItem.Value.ToString()); 
DataTable dt = GetData(query, prms); 

Заметьте также, что я поставил поле Год между квадратными скобками. Год - это имя функции T-SQL, и вы должны использовать этот трюк, чтобы избежать путаницы SQL Parser

Смежные вопросы