Question

J'appelle un package SSIS à l'aide de LoadPackage (...).

Est-il possible de faire de cet appel un appel asynchrone?

Était-ce utile?

La solution

Oui, utilisez un délégué asynchrone, tel que présenté ici:

http://msdn.microsoft.com/en-us/library /h80ttd5f.aspx

Autres conseils

Si vous souhaitez simplement qu’il s’exécute en arrière-plan, vous pouvez soit spooler un thread, soit appeler du T-SQL pour créer dynamiquement un travail (puis le supprimer à nouveau). Si vous voulez le lancer de manière asynchrone et que vous voulez un rappel quand c'est fait, alors je pense que vous n'avez malheureusement pas de chance.

Demandez-vous s'il est 1) légal d'appeler LoadPackage sur un thread d'arrière-plan ou 2) si c'est possible. Pour le n ° 1, je ne peux pas donner de réponse définitive car je n’utilise pas le framework SSIS.

Cependant, le n ° 2 (tant que le n ° 1 est vrai) est tout à fait faisable. IMHO, vous feriez mieux d'utiliser un framework existant avec des API conçues pour appeler les API de manière asynchrone et attendre les résultats. Par exemple, avec Parellel Extensions Juin 08 CTP, le code suivant fera l'affaire.

using System.Threading.Tasks;
...
var future = Future.Create(()=>LoadPackage); // Starts loading the package
// Do other stuff
var package = future.Value;  // Wait for package load to complete and get the value

J'appelle un package SSIS à partir de mon interface utilisateur (WPF) via un appel de service asynchrone WCF. Le code de service est:

public string ImportMarriageXML(bool isWakeUp, bool clearExistingMarriage)
{
    try
    {
        var dts = new Microsoft.SqlServer.Dts.Runtime.Application();

        using (var package = dts.LoadFromSqlServer(
            ServiceSettings.Settings.SSIS.ImportMarriages,
            ServiceSettings.Settings.SSIS.ServerIP,
            ServiceSettings.Settings.SSIS.UserID,
            ServiceSettings.Settings.SSIS.Password,
            null))
        {
            package.InteractiveMode = false;
            package.Connections["DB.STAGING"].ConnectionString = String.Format("{0};Provider={1};", DBSettings.ConnectionString(Core.Database.Staging), ServiceSettings.Settings.SSIS.Provider);

            var variables = package.Variables;
            variables["IsWakeUp"].Value = isWakeUp;
            variables["ClearExistingMarriage"].Value = clearExistingMarriage;
            variables["XmlDirectory"].Value = ServiceSettings.Settings.SSIS.Properties.XmlDirectory;

            if (package.Execute() == DTSExecResult.Failure)
            {
                // HACK: Need to refactor this at some point. Will do for now.
                var errors = new System.Text.StringBuilder();
                foreach (var error in package.Errors)
                    errors.AppendFormat("SubComponent: {0}; Description: {1}{2}", error.SubComponent, error.Description, Environment.NewLine);
                throw new ApplicationException(errors.ToString());
            }

            return package.Connections["Text Logging"].ConnectionString;
        }
    }
}

Et (une partie de) le code côté client est le suivant:

private void InvokeLoadMarriages()
{
    integrationServicesServiceClient.BeginImportMarriageXML(false, OnEndImportMarriageXML, null);
}

private void OnEndImportMarriageXML(IAsyncResult asyncResult)
{
    view.InvokeDisplayResults(integrationServicesServiceClient.EndImportMarriageXML(asyncResult));
}

Où BeginImportMarriageXML & amp; EndImportMarriageXML sont les opérations asynchrones générées dans la classe proxy.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top