سؤال

أحصل على "استثناء غير معقول من النوع". حدث 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(',');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top