استثناء Stackoverflow في مرشح صف Dataview
-
02-10-2019 - |
سؤال
أحصل على "استثناء غير معقول من النوع". حدث stackoverflowexception "في system.data.dll" في خاصية Dataview Rowfilter الخاصة بي. أنا لا أحصل على أي أثر مكدس لذلك. لذلك يمكن لأي شخص مساعدتي في ذلك. يرجى العثور أدناه على الرمز حيث أحصل على الخطأ في 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
شكرا ، ميهول ماكوانا.
المحلول 3
حصلت على هذا ثابت بمساعدة 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());
}
بحيث كان استثناء فائض المكدس بسبب نتيجة ضخمة. ووجدت شيئًا جديدًا يتراكم هذا أنه يمكننا استخدام Rowfilter على عمود GUID باستخدام تحويل (تعبير ، اكتب) بناء الجملة.
شكرا كل 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() + ")");
}
هل يمكنك فقط التحقق من ما هو مدمج في "QueryBuilder"؟ أعتقد أن هناك إمكانية للبعض "و"/"أو"/فتح أو إغلاق الدعامة قادم إضافي في النهاية.
تبسيط الحل
StringBuilder sb =new StringBuilder();
res.ToList().ForEach(x => sb.Append(", " + String.Format("Convert('{0}','System.Guid')", new Guid(x))));
var output = sb.ToString().Trim(',');