2011-08-29 6 views
2

Comment analyser une telle requête SQL .. ou Connaissez-vous des parseurs open source qui peut l'analyser:C#: Comment analyser une requête utilisateur

(((adsfa ≤ "value") AND (adsfa > "value")) OR (adsfa = "value")) 
AND (adsfa ≤ "value") OR ((adsfa ≤ "value") AND (adsfa ≤ "value")) 
AND (adsfa ≤ "value") 

J'ai essayé de construire mon propre algorithme avec string.Split(stringSeparators,StringSplitOptions.RemoveEmptyEntries) algorithme devient de plus en plus compliqué mais je trouve plus de combinaisons qu'il ne peut pas analyser.


  • adsfa est le nom de la colonne
  • ≤ est opérateur
  • "valeur" est la valeur

MISE À JOUR: Merci à tous, peut-être que je vais utiliser l'un des parseurs dans la prochaine version.

+2

Pour les électeurs de proximité: Qu'est-ce qui n'est pas compréhensible ici? O_o –

Répondre

4

J'ai développé quelque chose comme ceci moi-même en utilisant la bibliothèque Irony. Il est toujours en alpha, mais a été stable pour moi jusqu'à présent. Notez cependant que je l'ai utilisé pour analyser les expressions qui ont été écrites par d'autres programmeurs, pas les entrées de l'utilisateur.

Voici une autre idée - si vous faites confiance à la source de la requête, et juste besoin de le convertir en SQL correct, peut-être quelques simples string.Replace() serait suffisant? C'est pratiquement déjà du SQL, juste les opérateurs sont des caractères étranges.

+0

A la fin de la journée, je vois que ce pseudo code ressemble à SQL. Peut-être avez-vous raison - la manière la plus simple est juste de ficeler.Remplacer() – 1gn1ter

0

Cela ressemble à de vrais problèmes. Normalement, je ferais quelque chose comme ça avec un librateur/librateur-libérateur comme FParsec en F #. Mais je ne pense pas qu'il existe quelque chose comme ça pour C# (Luke Hoben a fait quelque chose de similaire here)

Pouvez-vous passer à F # pour cette partie de votre projet?

1

Si ce sont les seules expressions dont vous avez besoin pour analyser, vous pouvez probablement écrire l'analyseur à la main en C#. Pour les crochets, vous devez recurcir, car vous ne savez pas à quelle profondeur ils peuvent être imbriqués. Jetez un oeil à this article J'ai écrit il y a quelques temps, vous pouvez probablement le réécrire pour répondre à vos besoins.

Lorsque les choses se compliquent à écrire un parseur à la main devient difficile, alors vous devriez probablement utiliser une boîte à outils. Mon arme de choix ces jours-ci en FParsec, bien que ce soit en F # pas en C#. C'est très très puissant et flexible.

Sinon, j'ai eu une bonne expérience avec .

Peut-être n'avez-vous pas besoin d'un analyseur complet, etc. Dites-nous ce que vous voulez faire exactement, pourquoi voulez-vous lire ces expressions? Peut-être qu'il y a un autre moyen.

GJ

Questions connexes