Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

String.Split ou Regex

1 réponse
Avatar
Cédric
Bonjour à tous,

J'aimerais pouvoir importer un script SQL (SQLite) en exécutant chaque
requête individuellement.

- Je lis le fichier SQL
- Je découpe le texte en spécifiant comme séparateur le ";"
- J'exécute chacune des requêtes

[code]
string query = File.ReadAllText("C:\\script.sql");
string[] str = query.Split(';');
for (int i = 0; i < str.Length; i++) {
try {
SQLiteCommand cmd = mDbConnect.CreateCommand();
cmd.CommandText = str[i];
if (cmd.CommandText != string.Empty)
cmd.ExecuteNonQuery();
}
catch (Exception ex) {
Console.WriteLine(str[i] + ex.ToString());
}
}
[/code]

MAIS

Dans le script SQL, le ";" ne signale pas systèmatiquement la fin d'une
requête, par exemple, pour un déclencheur le code SQL est le suivant:

[code]
CREATE TRIGGER agent_commune
BEFORE INSERT ON agent
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'Impossible de trouver l''enregistrement lié')
WHERE (SELECT Num FROM Commune WHERE Num = NEW.Localite) IS NULL;
END;
[/code]

Donc il faudrait trouver autre chose pour découper le contenu du script.
J'ai essayé d'utiliser les expressions régulières (Regex) mais je n'y
arrive pas... Je n'y connais rien aux expressions régulières, après
avoir lu qq sites, je suis arrivé au code suivant (qui ne fonctionne pas):

[code]
string[] str = Regex.Split(query, "[^(END;)?];");
[/code]

Quelqu'un pourrait-il m'aider ?

Merci d'avance.

Cédric.

1 réponse

Avatar
Xavier
Cédric a écrit :
.....
[code]
CREATE TRIGGER agent_commune
BEFORE INSERT ON agent
FOR EACH ROW BEGIN
SELECT RAISE(ABORT, 'Impossible de trouver l''enregistrement lié')
WHERE (SELECT Num FROM Commune WHERE Num = NEW.Localite) IS NULL;
END;
[/code]





ca ne fonctionnera pas mieux , car tu peux te retrouver avec un scrit
fantaisiste comme ça :

Create Procedure Toto
@Titi int = null
as
Begin
Select @Titi
End

ou il n'y a pas de ; ni de End;

La solution est d'utilisé un parser incluant la grammaire du serveur Sq l sur
lequel tu travailles, comme ça au passage, ca te permet de vérifier l a syntaxe
du code PL/SQL de ton script.

Xavier.