2010-09-13 35 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(',');