IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SSIS Discussion :

Appel package via Progam Visual Studio


Sujet :

SSIS

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut Appel package via Progam Visual Studio
    Bonjour,
    Je souhaite appeler un package installé sur un serveur 2008R2 via Visual Studio. Comme la version du Framework est le 2.0, j'ai du changé le Framework de mon projet pour être en 2.0.
    J'ai appelé la dll Microsoft.SQLServer.ManagedDTS au bon endroit.

    L'appel fonctionne bien via le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
            private void btn_Action_Click(object sender, EventArgs e)
            {
                SSIS.Package pkg = new SSIS.Package();
                SSIS.Application app;
                SSIS.DTSExecResult pkgResults;
     
                app = new SSIS.Application();
                Cursor.Current = Cursors.WaitCursor;
                txt_Log.BackColor = Color.Yellow;
                pkg = app.LoadFromSqlServer(@"\\MonPackage", "monserveur",null,null,this);
                pkgResults = pkg.Execute();
                Cursor.Current = Cursors.Default;
                if (pkgResults == SSIS.DTSExecResult.Success)
                {
                    txt_Log.BackColor = Color.LawnGreen;
                }
                else
                {
                    txt_Log.BackColor = Color.Red;
                    foreach (SSIS.DtsError err in pkg.Errors)
                    {
                        txt_Log.Text += err.Description + "\n";
                    }
                }
            }
    Petite indication : Il s'agit d'une application Form avec un btn_Action qui déclenche l'appel du package. This est la form et txt_Log est un textbox dans la forme qui va recevoir les informations de progression du package.
    Pour ceux qui ont un peu de connaissance avec ces bibliothèque, il est évident que this implémente IDTSEvents. (SSIS est un alias au namespace Microsoft.SqlServer.Dts.Runtime).

    Sur la méthode OnProgress de l'interface IDTSEvents (et donc de this), j'ai écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    public void OnProgress(SSIS.TaskHost taskHost, string progressDescription, int percentComplete, int progressCountLow, int progressCountHigh, string subComponent, ref bool fireAgain)
            {
                txt_Log.Text += progressDescription + "\n";
                txt_Log.Refresh();
                txt_Log.BackColor = Color.Yellow;
            }

    A prioris le package tourne sauf que je ne logge rien du tout et en debug je constate que je ne rentre pas dans la méthode OnProgress.


    J'ai donc ensuite fait passer l'interface non pas avec la méthode LoadFromSqlServer mais Execute en mettant null à tous les autres paramètres (SSIS.Connections, SSIS.Variables,...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pkg = app.LoadFromSqlServer(@"\\MonPackage", "monserveur",null,null,null);
                pkgResults = pkg.Execute(null,null,this,null,null);
    Et là en debug je rentre bien dans la méthode OnProgress.
    Mais j'ai une erreur à l'execution comme si mon package n'arrivait pas à se connecter à la BDD (je pense que cela vient de l'assignation null à SSIS.Connections mais je ne sais pas quoi mettre).


    Quelqu'un a t il une idée ?

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut Intitulé de l'erreur
    J'ai peut être oublié de définir l'erreur : c'est la suivante :

    L'opération n'est pas valide en raison de l'état actuel de l'objet.

  3. #3
    Membre averti
    Homme Profil pro
    Consultant B.I. / .net
    Inscrit en
    Mai 2003
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant B.I. / .net

    Informations forums :
    Inscription : Mai 2003
    Messages : 215
    Points : 445
    Points
    445
    Par défaut
    Bonjour,

    De mémoire pour voir fait ça il y a quelque temps, si tu souhaites trapper les événements lors de l'exécution c'est effectivement en paramètre de la méthode Execute qu'il faut donner ton implémentation de IDtsEvents, autrement, tu trappes les événements de la désérialisation du package mais pas de l'exécution.

    A quelle ligne rencontres tu ton erreur ? Es tu sûr qu'il ne s'agit pas de l'état de ton contrôle winform (pb lié au contexte asynchrone pas exemple) ?
    Peux tu donner la call stack pour avoir une meilleure idée du soucis ?

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    Merci pour ta réponse,
    En fait il ne s'agit pas à proprement parlé d'une erreur Visualt Studio.

    En effet c'est la méthode Package.Execute(...) qui renvoie l'énum DTSExecResult. Or celui là prend la valeur de DTSExecResult.Failed. Dans l'objet de type Package il y a un attribut Errors. En faisant un foreach de l'attribut j'affiche les attributs Description de chaque Item et c'est là que j'ai affiché l'erreur que j'ai donné précédemment.

    Le stacktrace ne servirait à rien puisque je ne passe pas dans un Try Catch : j'afficherais juste la méthode btn_Action_Click dans le stacktrace.

    Je n'ai pas donné l'erreur en entier car je ne voulais pas polluer. Mais sinon l'erreur donne plutôt :

    L'exécution de la requête <RequeteDeLaPremiereTacheDeFluxDansSSIS> a échoué avec l'erreur suivante*: «*L'opération n'est pas valide en raison de l'état actuel de l'objet.*». Causes possibles de cet échec*: problèmes liés à la requête, propriété «*ResultSet*» non définie correctement, paramètres non définis correctement ou connexion non établie correctement.

    La méthode Execute sur la tâche a retourné le code d'erreur 0x80131509 (L'opération n'est pas valide en raison de l'état actuel de l'objet.). La méthode Execute doit réussir et indiquer le résultat à l'aide d'un paramètre de sortie.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    Re,
    J'ai fait un test intéressant :
    Dans la méthode :
    Package.Execute
    j'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pkgDTSResult = pkg.Execute(null, null, sqlListener, null, null);
    /* Petite précision j'ai mis mes méthodes OnProgress, OnError,... dans une classe à part SqlPackageEventsListener qui hérite de DefaultEvents (qui elle même hérite de l'interface IDTSEvents) : l'intérêt est de ne pas instancier toutes les méthodes. sqllistener est une instance de clase SqlPackageEventsListener */
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pkgDTSResult = pkg.Execute(null, null, null, null, null);
    Et là je n'ai pas d'erreur.

    Bon ça ne réponds pas à mon problème puisque je veux trapper les évenements mais au moins ça cible un peu plus le problème

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    Bonjour,
    Mon affaire est résolu : visiblement tout venait du faire de la méthode OnProgress : la façon dont je devais l'utiliser ne devait pas être la bonne.
    Je l'ai remplacé par la méthode OnInformation et je n'ai plus de problème.

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    Mouais pas satisfait.

    Dans mon programme j'ai une méthode sqlListener_OnPackageInformation(object sender, EventArgs args) appelé sur l'évenement OnInformation de l'objet sqllistener.

    Je souhaite mettre à jour le textbox dans la méthode : je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void sqlListener_OnPackageInformation(object sender, EventArgs args)
    {
       this.txt_Log += ((PackageInformationEventArgs)args).Description + "\n";
    }
    Et il ne se passe rien.
    Après avoir mis un try catch je me rends compte que je suis sur une erreur de type opération inter-threads.
    Je ne me démonte pas et remarque que pour un thread différent que celui qui l'a créé, la méthode a appelé est Invoke pour un textbox.

    Du coup j'enrichis mon code de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    private delegate void delegateUpdateTextBox(string message);
     
    public void sqlListener_OnPackageInformation(object sender, EventArgs args)
    {
       string description= ((PackageInformationEventArgs)args).Description + "\n";
       if (txt_Log.InvokeRequired)
            txt_Log.Invoke(new delegateUpdateTextBox(updateTextBox), description);
       else
            txt_Log.Text += description;
    }
     
     
     
    private void updateTextBox(string str)
    {
           txt_Log.Text += str;
    }
    Mais là en debug je me rends compte que je ne sors jamais de l'instruction : txt_Log.Invoke(new delegateUpdateTextBox(updateTextBox), description);

    Du coup j'ai des doutes que mon truc soit possible.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/07/2009, 19h20
  2. Connection Odbc via VC7 sous Visual studio 2003
    Par jlassira dans le forum MFC
    Réponses: 1
    Dernier message: 01/02/2006, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo