Logo UGIdotNET

DataView, Like e escape dei caretteri speciali

Con la DataView è possibile ordinare (DataView.Sort Property) e filtrare (DataView.RowFilter Property) i dati di una DataTable. Le espressioni di filtro dispongono di alcune funzionalità tipiche del linguaggio SQL come la LIKE che - con alcune limitazioni - filtra campi che iniziano, finiscono o contengono determinati valori. Ovviamente l'espressione è soggetta a specifiche legate ad alcuni caratteri speciali - di uso raro - che se ci dimentichiamo di gestire ci possono fare inciampare in eccezioni poco gradite.

Non è sufficiente una semplice replace data la natura dei caratteri speciali e le modalità di escape necessarie. Ecco come ho risolto il problema con l'aiuto delle potenzialità delle Regular Expression e del MatchEvaluator, delegate che permette di avere maggiore controllo nelle logiche di replace a fronte di match.

class DataViewHelper
{
  static string OnLikeEscapeEvaluate(Match match)
  {
    switch (match.Value)
    {
      case "%": return "[%]";
      case "*": return "[*]";
      case "[": return "[[]";
      case "]": return "[]]";
      case "'": return "''";
      default: return match.Value;
    }
  }

  public static string LikeEscape(string value)
  {
    return Regex.Replace(value, "['%*\\[\\]]",
      new MatchEvaluator(OnLikeEscapeEvaluate));
  }
}

Seguono esempi di utilizzo della classe.

//Filtro per campo "City" che inizia per "Mi"
myDataView.RowFilter =
  string.format("City LIKE '{0}%'", DataViewHelper.LikeEscape("Mi"))

//Filtro per campo "City" che contiene "d'Adda"
myDataView.RowFilter =
  string.format("City LIKE '%{0}%'", DataViewHelper.LikeEscape("d'Adda"))

Per maggiori informazioni sulla sintassi usabile nei filtri, su caratteri speciali e relative logiche di escape rimando alla documentazione di msdn "DataColumn.Expression Property".

Autore: Marco Barzaghi
Data: 27 maggio 2005
Ultimo aggiornamento: 07 luglio 2005
Categorie:  Data Access

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185