Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#/&Oracle] Passer un gros script SQL sans timeout

Best practice : Quel technique, provider choisir ?

Sujet résolu
    29 août 2011 à 11:14:03

    Bonjour à tous,

    Voici le contexte de mon problème :
    Je développe actuellement une solution de mise à jour de base de donnée en C# (WPF) d'une version d'un logiciel vers une autre :
    Le logiciel vérifie la base de donnée du client et en déduis les script à passer pour la mise à jour de son application. Les scripts sont concaténés dans un fichier SQL afin de créer un fichier de mise à jour de la base.

    Voici mon besoin :
    Je dois passer un gros fichier SQL (sur une base Oracle) qui a des commandes qui peuvent prendre beaucoup de temps a passer et je dois récupérer le retour d'erreur et si possible le retour des commandes. (Dans un second temps je devrais adapter mon logiciel pour que le type de base soit paramétrable Informix ou SQL Server)

    Voici mes pistes :
    Lancer un processus "sqlplus" et passer le fichier mais cela nécessite que le client ai SQL plus d'installé (or ce n'est pas toujours le cas) j'aimerais donc éviter cette solution.

    J'ai penser ensuite utiliser un provider pour éviter au client des installations (comme ODP.NET mais peut-être que vous me conseillerez mieux je suis un peut débutant en connections Oracle) et passer le contenu du fichier. Ici j'ai un risque de timeout...

    J'ai pensé utiliser un provider et découper les commandes puis les passer unes par unes. (A la manière du script PHP Bigdump pour ceux qui connaissent). Ici c'est un peu complexe car les fichiers sont pas très propres. Il y a des lignes commentées avec des scripts dedans /* SELECT * FROM toto; */, des procédures etc., le parseur risque donc d'être très dure à faire.

    Enfin la question :
    Quelqu'un a-t-il fais quelque chose dans le style qui aurais des conseil à me donner sur une méthode à utiliser ?

    Merci de votre aide,

    Edit : les fichiers SQL concaténés ont-étés conçus à destination de SQL plus.
    • Partager sur Facebook
    • Partager sur Twitter
      29 août 2011 à 17:30:42

      Etant donné que tu es de SUPINFO, est-ce que tu as déjà contacté les différents Full Prof (.NET et Oracle). Ils sont accessibles et m'ont déjà aidé dans mon stage.

      Autrement je ne vois pas comment t'aider sans l'install de SQL Plus.
      • Partager sur Facebook
      • Partager sur Twitter
        29 août 2011 à 20:57:46

        Ce n'est sans doute pas exactement ce que tu cherches, mais c'est ce que je connais de plus proche par rapport à ton besoin et ça pourra sans doute t'inspirer d'une façon ou d'une autre (et puis c'est un bon outil à connaitre pour d'autres zéros) : Connais-tu Migrator.Net ? :)

        En gros c'est une bibliothèque qui permet de manipuler la structure d'une base de données en C# plutôt qu'en SQL. On écrit donc ses scripts de migrations (et de rollback) en C#, on compile le tout en une DLL, et on passe cette DLL en argument du programme Migrator.exe avec la chaine de connexion de la base cible (et éventuellement le numéro de version à atteindre). Les instructions C# sont ainsi converties en SQL en fonction du SGBD ciblé (Oracle, SQL Server, etc), et le passage d'une version à l'autre (même antérieure) devient très facile.

        Exemple avec une migration de Code Arena :

        [Migration(1012040304)]
        public class AddCompetitorEnergyManagement : Migration
        {
            public override void Up()
            {
                Database.AddColumn(Tables.Competitions.Competitor,
                    new Column("Energy", DbType.Int16, ColumnProperty.NotNull, 10));
        
                Database.AddColumn(Tables.Competitions.Competitor,
                    new Column("MaxEnergy", DbType.Int16, ColumnProperty.NotNull, 5));
        
                Database.AddColumn(Tables.Competitions.Competitor,
                    new Column("NextEnergyBoostDateTime", DbType.DateTime, ColumnProperty.Null));
            }
        
            public override void Down()
            {
                Database.RemoveColumn(Tables.Competitions.Competitor, "NextEnergyBoostDateTime");
                Database.RemoveColumn(Tables.Competitions.Competitor, "MaxEnergy");
                Database.RemoveColumn(Tables.Competitions.Competitor, "Energy");
            }
        }
        


        Ce n'est pas vraiment ce que tu veux faire ici, car tes scripts de migration sont apparemment en SQL et tu veux automatiser leur exécution. Mais rien ne t'empêche de faire appel à ces scripts SQL depuis ton code C# de migration, c'est un peu tordu mais ça devrait passer. :-° Rien ne garantit que ça va résoudre ton problème de timeout cependant, mais la plus grande partie du travail de gestion des versions de la base et de passage d'une version à l'autre serait déjà toute faite :)

        Et comme je l'ai dit même si Migrator.Net ne pourra peut-être pas t'aider ici, ça reste un bon outil à connaitre ^^
        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2011 à 9:39:25

          Merci merci Unk0, je vais contacter les full profs mais vu que c'est un mélange SQL Plus (Oracle) et C#, va falloir que j'en trouve un qui as les deux compétences...

          Je viens au passage de me rendre compte que les fichiers SQL contiennent des commandes SQL Plus, je pense donc que la première étape va être de faire un grand ménage !!!

          Ensuite je pense adopter le passage ligne à ligne en parsant mes fichiers SQL. ça me permet une meilleur gestion d'erreur.

          Merci beaucoup Orwell, je suis en effet dans une démarche de recherche d'outils pour des migration de version de logiciels de mon entreprise. Ce que tu viens de me présenter est super ! Je vais aller voir de plus pret comment ça fonctionne (ca à pas l'air compliqué mais sa a l'air bien puissant) ! Ca m'a l'air super comme outil !

          Je vais passer ce sujet en résolu (Donc ménage->parsage->passage commande par commande),

          Merci encore à vous deux pour vos conseils,
          • Partager sur Facebook
          • Partager sur Twitter

          [C#/&Oracle] Passer un gros script SQL sans timeout

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown