Salut à tous.
Dans le cadre du développement d'un outil de grosse maintenance ponctuelle de bases de données client, j'ai un script SQL (SQLServer 2017) que j'appelle depuis un code C# :
Ce script contient plus de 300 requêtes encadrées par une transaction (elle est gérée directement dans le script pour le moment, mais si nécessaire, je devrais pouvoir la déplacer dans le C# au besoin). Sur de très grosses bases il peut prendre plusieurs 10ènes de minutes à s'exécuter entièrement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 using (SqlConnection cnx = CommonTools.GetSqlConnection(databaseNameCible)) { string scriptFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, "SqlScripts", "mon_script.sql"); string sqlScript = System.IO.File.ReadAllText(scriptFilePath); using (SqlCommand cmd = new SqlCommand(sqlScript, cnx)) { cmd.Parameters.Add("@BddCible", SqlDbType.VarChar); cmd.Parameters["@BddCible"].Value = databaseNameCible; cmd.Parameters......... cnx.Open(); cmd.ExecuteNonQuery(); } }
NOTA : Je suis pour le moment sur du code synchrone, mais je m'interdis pas de passer sur de l'async/await, voire explicitement des task si besoin.
Afin de faire patienter l'utilisateur et éventuellement alimenter un log, je souhaiterais que ce script puisse me renvoyer régulièrement une information d'avancement.
- Existe-il des instructions à rajouter dans le script sql pour qu'il renvoie régulière, mais immédiatement, pas à la fin de l'exécution, une information pouvant indiquer l'avancement
- comment, coté code C# récupérer cette info (callback, peut-être ?), en temps réel, et non pas uniquement une fois que ExecuteNonQuery rend la main.
Est-ce simplement possible ?
Bon, j'ai toujours une solution un peu barbare, qui serait de découper automatiquement le script et de ne l'exécuter que par blocs de 10% des lignes, en prenant garde à avoir 1 requête=1ligne. Mais je trouve pas ça très "pro", c'est un peu bricole
Partager