[英]stackoverflow exception in DataView row filter
我在DataView rowfilter屬性中收到“ System.Data.dll中發生了'System.StackOverflowException類型的未處理異常”。 我沒有得到任何堆棧跟蹤。 所以任何人都可以幫助我。 請在下面的代碼中找到我在filterView中遇到的錯誤。
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。
也許您用或創建了一條巨大的線,這無法處理...如果嘗試此操作...?
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() + ")");
}
您可以驗證一下“ queryBuilder”中內置的內容嗎? 我認為最后可能會有一些“和” /“或” /打開或關閉大括號 。
我在亞里士多德(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。
簡化解決方案
StringBuilder sb =new StringBuilder();
res.ToList().ForEach(x => sb.Append(", " + String.Format("Convert('{0}','System.Guid')", new Guid(x))));
var output = sb.ToString().Trim(',');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.