Frage

Ich rufe ein SSIS-Paket mit Loadpackage (...).

Ist es möglich, das einen asynchronen Aufruf machen anrufen?

War es hilfreich?

Lösung

Ja, verwenden Sie einen asynchronen Delegaten, wie hier demostrated:

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

Andere Tipps

Wenn Sie nur im Hintergrund ausgeführt werden soll, dann ja, können Sie entweder die Spule einen Faden oder eine T-SQL-Aufruf, um dynamisch einen Auftrag zu erstellen (und entfernen Sie ihn danach wieder). Wenn Sie es asynchron und möchten einen Rückruf ausgeführt werden soll, wenn es fertig ist, dann denke ich, Sie Pech sind leider.

Sind Sie fragen, ob es 1) legal auf Loadpackage einem Hintergrundthread zu nennen oder 2) ist es möglich. Für 1 # kann ich nicht eine definitive Antwort geben, weil ich nicht den Rahmen SSIS verwenden.

Allerdings # 2 (solange # 1 wahr ist) ist auf jeden Fall machbar. IMHO, sind Sie besser dran einen bestehenden Rahmen verwendet, die dem Aufruf von API async und warten auf die Ergebnisse entwickelt API hat. Zum Beispiel mit Parellel Erweiterungen 08 CTP Juni wird der folgende Code tun.

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

Ich rufe ein SSIS-Paket aus meiner UI (WPF) über einen asynchronen WCF-Service-Aufruf. Service-Code lautet:

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;
        }
    }
}

Und (ein Teil) der clientseitigen Code ist wie folgt:

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

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

Wo BeginImportMarriageXML & EndImportMarriageXML sind die erzeugten Asynchron-Operationen in der Proxy-Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top