Question

Je me fais « Une exception non gérée du type « System.StackOverflowException » est produite dans system.data.dll » dans ma propriété DataView RowFilter. Je ne reçois aucune trace de pile pour cela. Alors que peut aider moi à ce sujet. S'il vous plaît trouverez ci-dessous le code où je reçois l'erreur dans 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

Merci, Mehul Makwana.

Était-ce utile?

La solution 3

Je suis arrivé que ce soit réglé par l'aide de Aristos, mais je ne peu de modifications à Aristos extrait,

        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());
                }

Cette exception de débordement de la pile était juste à cause de résultat énorme. Et ont trouvé une nouvelle chose accross ce que nous pouvons utiliser RowFilter sur la colonne à l'aide Guid Convert (expression, type) syntaxe.

Merci Every1,

Mehul Makwana.

Autres conseils

Peut-être que vous créez une énorme ligne avec ou, qui ne peut pas gérer ... Si vous essayez ceci ...?

   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() + ")");
    }

Pouvez-vous vérifier tout ce qui est en cours de construction en « QueryBuilder »? Je pense qu'il ya une possibilité d'un « Et » / « ou » / croisillon ouvrir ou fermer à venir supplémentaire à la fin.

simplifié la 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(',');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top