2010-09-13 4 views
1

Я получаю «Необработанное исключение типа« System.StackOverflowException », произошедшее в System.Data.dll, в моем свойстве datafilter DataView. Я не получаю трассировку стека для этого. Так может кто-нибудь помочь мне в этом. Ниже приведен код, где я получаю ошибку в filterView.Исключение stackoverflow в фильтрах строк DataView

   DataSet metalAttributeDS = LoadItemData(); //loads the static dataset 
       DataTable metalDataTable = metalAttributeDS.Tables["FilterTable"]; 
       DataView metalfilterView = new DataView(metalDataTable); 
       metalfilterView.ApplyDefaultSort = true; 
       metalfilterView.RowFilter = queryBuilder + 
              string.Format(
               " And AttributeName='Metal' and AttributeValueID in ({0})", 
               string.Join(",", AttributeValueID.ToArray()));  //forms query condition dynamically. 

       var res = from DataRowView rowView in metalfilterView select rowView["ItemID"].ToString(); 

       int countParam = 0; 
       queryBuilder.AppendFormat(" and ("); 
       foreach (string id in res) 
       { 
        countParam++; 
        queryBuilder.AppendFormat(" ItemID = '{0}'", id); 
        if (res.Count() > countParam) 
        { 
         queryBuilder.Append(" Or"); 
        } 
       } 
       queryBuilder.Append(")"); 
      } 


      DataSet dataSet = LoadItemData();  //loads the static dataset 
      DataTable dataTable = dataSet.Tables["FilterTable"]; 
      DataView filterView = new DataView(dataTable); 
      filterView.ApplyDefaultSort = true; 

       LogHelper.LogInfo(GetType(), "filterView.RowFilter"); 
       filterView.RowFilter = queryBuilder.ToString(); //  throws error 

Спасибо, Mehul Makwana.

+0

Вот где проблема. Я думаю, фильтр пытается сравнить идентификатор строки с идентификатором Guid и получить ошибку. –

+0

исключение переполнения стека не из-за этого. Я поменял свой код на то, что предложил аристос, чтобы я дал ошибку, что я не могу выполнить = операцию на System.Guid. – mehul9595

ответ

0

Я получил это фиксируется помощью Ариста, но я сделал небольшие изменения в Аристос сниппет,

 foreach (string id in res) 
       { 
        sbTheOr.Append(','); 
        Guid guid = new Guid(id); 
        sbTheOr.AppendFormat("Convert('{0}','System.Guid')",guid); 
       } 

       if (sbTheOr.Length > 0) 
       { 
        // remove the first , 
        sbTheOr.Remove(0, 1); 
        queryBuilder.AppendFormat(" and ItemID in ({0})",sbTheOr.ToString()); 
       } 

Так что переполнение стека исключения просто из-за огромный результат. И нашли новую вещь в этом отношении, что мы можем использовать RowFilter on Guid, используя синтаксис Convert(expression, type).

Благодаря every1,

Mehul Makwana.

1

Возможно, вы создали огромную линию с или, которая не может справиться ... Если вы попробуете это ...?

StringBuilder sbTheOr = new StringBuilder(); 

    foreach (string id in res) 
    { 
     sbTheOr.Append(','); 
     sbTheOr.Append(id); 
    } 


    if (sbTheOr.Length > 0) 
    { 
     // remove the first , 
     sbTheOr.Remove(0, 1); 
     queryBuilder.AppendFormat(" and ItemID IN (" + sbTheOr.ToString() + ")"); 
    } 
+0

yes res содержит огромный набор результатов. так что это может быть проблемой ?. хорошо, попробуйте с фрагментом, что вы дали, и дайте знать. Спасибо за помощь. :) – mehul9595

+0

эй друг, я попробовал то, что ты предложил мне. Теперь появляется сообщение «Отсутствует операнд после« dbb »оператора. – mehul9595

+0

В трассировке стека он сообщает мне «Не могу выполнить» = «операцию в System.Guid и System.String». – mehul9595

0

Можете ли вы просто проверить, что встроено в «queryBuilder»? Я думаю, что есть вероятность, что есть 'И'/'Or'/открыть или закрыть скобку в дополнение к концу.

+0

Я проверил значение построителя запроса. Он содержит запрос, отлично сформированный. :( – mehul9595

0

упростил решение

StringBuilder sb =new StringBuilder(); 
res.ToList().ForEach(x => sb.Append(", " + String.Format("Convert('{0}','System.Guid')", new Guid(x)))); 
var output = sb.ToString().Trim(',');