I am getting "An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll" in my DataView rowfilter property. I'm not getting any stack trace for that. So can any one help me on that. Please find below the code where i'm getting the error in 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
Thanks, Mehul Makwana.
Maybe you create a huge line with or, that can not handle... If you try this... ?
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() + ")");
}
Can you just verify what is being built into 'queryBuilder' ? I think there is a possibility of some 'And'/'Or'/open or close brace coming extra at the end.
I got this fixed by help of Aristos but, i did little modifications to Aristos snippet,
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());
}
So that stack overflow exception was just because of huge result. And have found new thing accross this that we can use RowFilter on Guid column using Convert(expression, type) syntax.
Thanks Every1,
Mehul Makwana.
Simplified the solution
StringBuilder sb =new StringBuilder();
res.ToList().ForEach(x => sb.Append(", " + String.Format("Convert('{0}','System.Guid')", new Guid(x))));
var output = sb.ToString().Trim(',');
精彩评论