2014-06-13 3 views
0

У меня была ошибка при отображении данных в сетку текстовых ссылок, которые исходят из результатов рекурсивного цикла.Как обрабатывать ошибку «Необработанное исключение типа« System.StackOverflowException »произошло в System.Data.dll«

, когда я отладки, появится сообщение: «Советы по устранению неисправностей: убедитесь, что вы не имеете бесконечный цикл или бесконечную рекурсию.»

и этот метод рекурсивной захвата петли со мной:

private void LevelControl(string parID) 
    { 
     DataSet ds = RunQuery("Select PositionCode,PositionName,Parent from Position where Parent = '" + parID + "'");   
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      var Parent = ds.Tables[0].Rows[i][0].ToString(); 
      var Child = ds.Tables[0].Rows[i][2].ToString(); 
      HyperLink lnk = new HyperLink(); 
      lnk = new HyperLink(); 
      lnk.Text = ds.Tables[0].Rows[i][1].ToString(); 
      lnk.ID = ds.Tables[0].Rows[i][0].ToString(); 
      lnk.NavigateUrl = "Tree03.aspx?parParent=" + Parent + "&parChild= " + Child + ""; 
      PlaceHolder1.Controls.Add(lnk); 
      if (ds.Tables[0].Rows[i][2] != null) 
      { 
       parID = ds.Tables[0].Rows[i][2].ToString(); 
       LevelControl(parID); 
      } 
      PlaceHolder1.Controls.Add(lnk); 
      PlaceHolder1.Controls.Add(new LiteralControl("<br />")); 
     } 
    } 

то что делать, чтобы решить эту проблему? Что следует добавить к коду в методе?

+0

Что такое базовый регистр для вашей рекурсии, например, какое значение «parID» вы можете оценить без рекурсивного вызова метода? –

+0

Ваш код в письменном виде приведет к бесконечной рекурсии. В первый раз, вы принимаете строку 0 столбца 2, затем вы вызываете метод снова. Второй вызов вы берете строку 0 столбца 2, снова вызываете метод, полоскаете, повторяете. У вас нет условий, где вы остановите рекурсию. Что вы пытаетесь достичь? – Tim

+0

Используйте параметризованные запросы, кстати. – Ryan

ответ

0

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

0 PositionCode 
1 PositionName 
2 Parent 

В приведенном ниже коде:

0 var Parent = ds.Tables[0].Rows[i][0].ToString(); 
1 lnk.Text = ds.Tables[0].Rows[i][1].ToString(); 
2 var Child = ds.Tables[0].Rows[i][2].ToString(); 

См: вы перепутали родитель и ребенок, и, следовательно, выполнить тот же запрос снова и снова.

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