exception stackoverflow dans le filtre de ligne DataView
-
02-10-2019 - |
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.
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(',');