2010-09-13 92 views
1

我收到“我的DataView rowfilter属性中出现”在System.Data.dll中发生类型'System.StackOverflowException'的未处理异常“。我没有得到任何堆栈跟踪。 所以任何人都可以帮助我。请在下面的代码中找到filterView中的错误。DataView行筛选器中的stackoverflow异常

   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

也就是说问题的所在。我认为,过滤器试图比较字符串id Guid id和获取错误。 – 2010-09-13 14:59:15

+0

堆栈溢出异常不是因为这个。我已经改变了我的代码与什么aristos建议,所以给我错误,我不能执行=操作System.Guid。 – mehul9595 2010-09-13 15:15:07

回答

0

我得到这个固定的Aristos的帮助,但是,我做一点修改Aristos的片段,

 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()); 
       } 

使堆栈溢出异常只是因为巨大的结果。并且发现了一个新事物,我们可以使用Convert(expression, type)语法在Guid列上使用RowFilter。

感谢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

是的res包含一个巨大的结果集。这样可以成为问题吗?病得好,试着用你给的一些片段,让你知道。感谢帮助。 :) – mehul9595 2010-09-13 14:26:49

+0

嘿朋友,我试着你建议我。它现在提供“dbb'运算符”错误之后缺少操作数。 – mehul9595 2010-09-13 14:49:24

+0

在堆栈跟踪中,它告诉我“无法对System.Guid和System.String执行'='操作。” – mehul9595 2010-09-13 14:54:17

0

你可以验证'queryBuilder'内建什么吗?我认为可能有一些'和'/'或'/打开或关闭大括号结束时额外的。

+0

我检查了我的查询生成器值。它包含完全格式化的查询。 :( – mehul9595 2010-09-13 14:40:46

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(',');