2015-03-11 3 views
0

Я хочу третьего GridView значение столбца зависит от первого столбца value.My кода, как показано ниже:высчитывает GridView значение столбца в asp.net

protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 

      GridViewRow item = e.Row; 
      string selectSQL = " SELECT fail,COUNT(*) AS 'Count' FROM Table WHERE Id =" + item.Cells[0].Text; 
      SqlConnection con = new SqlConnection(connectionstring.ToString()); 
      SqlCommand cmd = new SqlCommand(selectSQL, con); 
      SqlDataReader reader; 
      try 
      { con.Open(); 
       reader = cmd.ExecuteReader(); 
       reader.Read(); 

       if (reader["Count"].Equals("0")) 
        item.Cells[3].Text = "0"; 
       else 
        item.Cells[3].Text = reader["Count"].ToString(); 
       reader.Close(); 
      } 
      catch (Exception err) 
      { } 
      finally 
      { 
       con.Close(); 
      } 


     } 
    } 

Edit:

GridViewRow item = e.Row; 
      int myvar; 
      Int32.TryParse(item.Cells[0].Text, out myvar); 
      string selectSQL = " SELECT COUNT(*) AS 'Count' FROM Table WHERE [email protected] group by Id"; 

Могу ли я сделай это ? Никакие изменения не отражаются в моем коде.

Я попытался debugging..the управление входит улов block..can't понять, где я буду неправильно

+0

Вы хотите добавить новый столбец в свое gridview, зависит от вашего первого значения столбца? Не совсем понятно, что вы пытаетесь сделать. Вы всегда должны использовать [параметризованные запросы] (http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/). Этот тип конкатенаций строк открыт для [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) атак. –

+1

У вас есть агрегат в вашем запросе без 'Group by' – Magnus

+0

@Soner, @ Magnus: см. Править пожалуйста – user1698232

ответ

0

Вы вызываете базу данных внутри RowDataBound. Предположим, что у вас тысячи строк, база данных будет называться тысячи раз.

  • Ваш первый запрос подвержен SQL injection.

Для решения этих проблем, сначала вы должны получить «COUNTS» для всех в Ids и хранить его в локальной переменной сказать словарь. Затем в течение RowDataBound вы можете использовать данные из локальной переменной.

В приведенном выше сценарии я смоделировал несколько выборочных данных.

Это моя локальная переменная объявлена ​​на Page уровне,

private Dictionary<int, int> dictionaryIds = new Dictionary<int, int>(); 

Это мой метод Page_Load,

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      BindData(); 
     } 
    } 

И это мой BindData метод,

private void BindData() 
    { 
     DataSet ds = new DataSet(); 

     using (SqlConnection connection = new SqlConnection(connectionstring.ToString())) 
     { 
      using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Table", connection)) 
      { 
       adapter.Fill(ds); 
      } 
     } 

     using (SqlConnection connection = new SqlConnection(connectionstring.ToString())) 
     { 
      using (SqlCommand command = new SqlCommand("SELECT COUNT(*) AS 'Count' FROM Table", connection)) 
      { 
       connection.Open(); 
       SqlDataReader reader = command.ExecuteReader(); 

       while (reader.Read()) 
       { 
        dictionaryIds.Add(Convert.ToInt32(reader["Id"].ToString()), Convert.ToInt32(reader["Count"].ToString())); 
       } 
       connection.Close(); 

      } 
     } 

     GridView2.DataSource = ds; 
     GridView2.DataBind(); 
    } 

И это мой RowDataBound Метод,

protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      GridViewRow item = e.Row; 
      int myvar; 
      Int32.TryParse(item.Cells[0].Text, out myvar); 

      if (dictionaryIds.ContainsKey(myvar)) 
       item.Cells[3].Text = dictionaryIds[myvar].ToString(); 
     } 
    } 

Еще одно предложение заключается в том, что вы должны переместить логику переноса данных в уровень доступа к данным.

Надеюсь, это поможет.

+0

Привет, Selva, оптимизация кода для меня сейчас не является приоритетом. Я согласен, что она будет называться много раз, но у меня очень мало строк в моем db.can u, пожалуйста, обратитесь к этому: – user1698232

+0

Пожалуйста, дайте ссылку для ссылки. –

+0

http://stackoverflow.com/questions/28987872/an-exception-of-type-system-invalidoperationexception-occurred-in-system-data – user1698232

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