Ik ben bezig om een database update wizard te maken die gebruikt gaat worden om de database bij de klant te updaten (met aanpassingen tabellen, nieuwe/aangepaste views/stored procedures, etc.).
Het grote gedeelte is nagenoeg klaar, echter op het belangrijkste punt zit ik een beetje vast, namelijk het uitvoeren van de update-scripts.
Ik voer een sql-script uit op de database, die een int teruggeeft met het huidige database-versienummer.
Nu wil ik aan de hand van dit versienummer bepalen welke scripts uitgevoerd moeten gaan worden. Hiervoor heb ik alvast de mogelijke versienummers in een een array gezet:
Stel dat de huidige versie 300 is, dan moet ik dus het script voor 310, 320, 330 en 340 uitvoeren. De scripts open ik via een StreamReader, dus de scripts zitten als Resource in de exe:
Nu is het ook nog eens zo, dat het script GO-separators bevat, dus moet ik de string met het script in stukken hakken, omdat ADO dan anders moeilijk gaat doen:
Hoe kan ik dit het beste aanpakken?
Ik heb al geprobeerd om met Arrays en Arraylists te gaan werken, maar kom er niet uit.
Ik heb dus al een Array met de mogelijk update-versienummers. Ik zou dan een 2e Array moeten hebben die de versienummers bevat waarnaartoe geüpdate kan worden. Vervolgens een 3e Array die de bijbehorende scripts bevat en als laatste een 4e Array waarin de scripts zijn opgedeeld in batches.
Dit lijkt mij een beetje te veel. Wie kan mij de juiste richting/methode/.... wijzen?
Het grote gedeelte is nagenoeg klaar, echter op het belangrijkste punt zit ik een beetje vast, namelijk het uitvoeren van de update-scripts.
Ik voer een sql-script uit op de database, die een int teruggeeft met het huidige database-versienummer.
Nu wil ik aan de hand van dit versienummer bepalen welke scripts uitgevoerd moeten gaan worden. Hiervoor heb ik alvast de mogelijke versienummers in een een array gezet:
C#:
1
| int[] PossibleUpdates = new int[] { 250, 260, 300, 310, 320, 330, 340 }; |
Stel dat de huidige versie 300 is, dan moet ik dus het script voor 310, 320, 330 en 340 uitvoeren. De scripts open ik via een StreamReader, dus de scripts zitten als Resource in de exe:
C#:
Het script open ik als string als volgt:1
2
3
4
5
6
7
8
| public static string GetResource(string resourceName) { Assembly asm = Assembly.GetExecutingAssembly(); TextReader textReader = new StreamReader(asm.GetManifestResourceStream(resourceName)); string result = textReader.ReadToEnd(); textReader.Close(); return result; } |
C#:
1
| GetResource("<namespace>.<folder>.<scriptfile.sql>"); |
Nu is het ook nog eens zo, dat het script GO-separators bevat, dus moet ik de string met het script in stukken hakken, omdat ADO dan anders moeilijk gaat doen:
C#:
1
2
3
4
5
6
7
8
9
| string query = GetResource("<namespace>.<folder>.<scriptfile.sql>"); Regex regex = new Regex(@"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline); string[] cmds = regex.Split(query); foreach (string line in cmds) { if (line.Length > 0) { // query uitvoeren |
Hoe kan ik dit het beste aanpakken?
Ik heb al geprobeerd om met Arrays en Arraylists te gaan werken, maar kom er niet uit.
Ik heb dus al een Array met de mogelijk update-versienummers. Ik zou dan een 2e Array moeten hebben die de versienummers bevat waarnaartoe geüpdate kan worden. Vervolgens een 3e Array die de bijbehorende scripts bevat en als laatste een 4e Array waarin de scripts zijn opgedeeld in batches.
Dit lijkt mij een beetje te veel. Wie kan mij de juiste richting/methode/.... wijzen?