Urgent-parcourir une chaine de caractère

soussou -  
 gator -
salut ts le monde,
j'arrive pas à résoudre ce pb :
j'ai cette chaine de car par exple :
select * from t1,t2,t3
et je veux parcourir cette chaine et récupérer après t1 t2 et t3
comment il faut faire svp?!
A voir également:

38 réponses

soussou
 
oui c bien ça, je te remercie bp!
pr le langage c le c.
merci d'avance
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
ah !!!! J'ai compris.
Tu as le texte d'un requête SQL et tu veux la parser pour en extraire le nom des tables !

Ok.... pfiou.

Bon je pense qu'on doit pouvoir s'en tirer avec une expression régulière.
0
soussou
 
c bien ça!!
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
Désolé j'avais mal compris.

En C, tu dois pouvoir en principe accéder à la librairie pcre.
(Pratiquement tous les langages permettent de faire des expressions regulières).

Je n'ai pas de compilateur C sous la main, mais ne Python, je ferais ça:
import re
requete = 'select toot,titi,tutu from t1,t2 ,t3 where f=5'
regexp = re.compile('from (.*?) where')
tables = regexp.search(requete).group(1)
print tables.split(',')


Quand on le lance, ça donne ça:
>python essai.py
['t1', 't2 ', 't3']

ça retourne bien la liste des tables.
(mais bon il faut encore gérer le cas où les tables sont renommées dans la requête, genre 'select a.toto, b.titi from clients a, commandes b where ...)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
soussou
 
juste une chose svp : en fait le langage c sera incorporé ds une procédure stockée sql, ce qui fait je cros que c pas ttes les commandes du lagge c sont autorisées.
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
Arg... parser du langage SQL en C qui sera inclu dans une procédure stockée...

Là à mon avis tu t'engage dans une uzine à gaz.
Tu devrais peut-être repenser la solution.
0
soussou
 
t'as pas une idée comment on le fait ds une procédure stockée?!
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
La question est: est-ce que c'est vraiment une bonne solution d'essayer de parser du SQL en C dans une procédure stockée.

Il faut avoir une très bonne raison technique pour faire ça, parceque c'est à la fois difficile, fragile et dangereux du point de vue sécurité.
0
soussou
 
la raison est que j'utilise SQL server. 2tant donnée que je veux parsé une req sql et le seul moyen pr faire ça sur sql server est d'utiliser des PS (car elles permettent de rajouter de la pgmat au lgge qsl, et le lgge utilisé ds les PS est le C), maintenant le pb est comment utiliser le lgge C ds une PS ds mon cas.
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
Je ne me suis jamais amusé à utiliser du C dans une procédure stockée.
Il va falloir que tu creuse dans MSDN...

Mais écrire un parseur SQL dans une procédure stockée, ça me paraît limite infaisable, ou bien terriblement compliqué et de toute façon bien trop fragile.

Il faut que tu prenne la grammaire complète de la commande SELECT et que ré-écrire toi-même un parseur pour cette syntaxe.

Bon courage !

(Je continue à penser que tu ne devrait te reposer ton problème autrement et trouver une autre solution que parser du SQL en C dans une procédure stockée.)
0
soussou
 
qu'est ce que vous me conseillez?!
juste une indication, la requête est formulée par un utilisateur, donc il faut que j'étudie ts les cas possibles de la req...
merci d'avance
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
Moi si un user me dit qu'il veut envoyer une requête SQL pour qu'elle doit exécutée sur le serveur, c'est NIET.
0
soussou
 
c quoi niet?!
une question svp : puisque je ne peux pas faire ça en sql server.....je vais essayer d'utiliser visual basic, vous savez comment je règle mon pb en utilisant VB?!
merci d'avance
0
m
 
soraya
0
soussou
 
bonjour,
j'essaye d'utiliser visual c++ pr régler mon pb. Pouvez vous m'aider à écrire le même prgme (que vous m'avez écrit en c) en c++?
merci d'avance
0
sebsauvage Messages postés 33415 Statut Modérateur 15 663
 
niet = non.
Je ne laisse pas les utilisateurs d'une application lancer la requête SQL qu'ils veulent, comme ça, sur le serveur SQL.
Question sécurité, c'est bien trop dangereux.

Pour accéder aux données de la base en VC++, tu peux passer par les librairies ODBC ou ADO.
Si tu veux manipuler le serveur (ajouter/supprimer des tables, accéder aux scripts de création des objets, etc.) et que ton serveur SQL est Microsoft SQL Server, tu peux passer par les objets SQL-DMO (exemple en Python, mais ça se transpose facilement au C++: http://wikipython.flibuste.net/moin.py/CodesBDD)
0
MARS\TOUTOU
 

                
0
gator
 
en vb ou en asp tu fait une concaténation de la requête c'est pas dur mais c'est la plus grosse c.....rie à faire !
on ouvre la porte à l'injection sql le client fait sa vie dans ta base!
le mieux c'est un choix de constitution par liste.
0