Исключение stackoverflow в фильтре строк DataView

Я получаю сообщение «Необработанное исключение типа« System.StackOverflowException »в System.Data.dll» в моем свойстве фильтра строки DataView. Я не получаю никакой трассировки стека для этого. Так может ли кто-нибудь помочь мне в этом. Пожалуйста, найдите ниже код, где я получаю сообщение об ошибке в 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

Спасибо, Мехул Маквана.


person mehul9595    schedule 13.09.2010    source источник
comment
Вот где проблема. Я думаю, что фильтр пытается сравнить идентификатор строки с идентификатором Guid и получить ошибку.   -  person Siva Gopal    schedule 13.09.2010
comment
исключение переполнения стека не из-за этого. Я изменил свой код на то, что предложил аристос, так что это дает мне ошибку, которую я не могу выполнить = операцию в System.Guid.   -  person mehul9595    schedule 13.09.2010


Ответы (4)


Может быть, вы создаете огромную очередь с или, что не можете справиться... Если вы попробуете это... ?

   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() + ")");
    }
person Aristos    schedule 13.09.2010
comment
yes res содержит огромный набор результатов. так что может быть проблема?. ну, я попробую с фрагментом, который вы дали, и дайте знать. Спасибо за помощь. :) - person mehul9595; 13.09.2010
comment
Эй, друг, я попробовал то, что ты мне предложил. Теперь он дает отсутствующий операнд после ошибки оператора «dbb». - person mehul9595; 13.09.2010
comment
В трассировке стека мне сообщается, что невозможно выполнить операцию '=' для System.Guid и System.String. - person mehul9595; 13.09.2010

Можете ли вы просто проверить, что встроено в «queryBuilder»? Я думаю, что в конце может появиться дополнительная скобка И'/'Или'/открывающая или закрывающая скобка.

person Siva Gopal    schedule 13.09.2010
comment
я проверил значение построителя запросов. Он содержит запрос в идеальном формате. :( - person mehul9595; 13.09.2010

Я исправил это с помощью Аристоса, но я сделал небольшие изменения во фрагменте Аристоса,

        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,

Мехул Маквана.

person mehul9595    schedule 13.09.2010

Упрощенное решение

 StringBuilder sb =new StringBuilder();
 res.ToList().ForEach(x => sb.Append(", " + String.Format("Convert('{0}','System.Guid')", new Guid(x))));
 var output = sb.ToString().Trim(',');
person kalidoss    schedule 07.02.2017