Вызов пакета служб SSIS асинхронно - PullRequest
1 голос
/ 02 января 2009

Я вызываю пакет служб SSIS, используя LoadPackage (...).

Возможно ли сделать этот вызов асинхронным?

Ответы [ 4 ]

1 голос
/ 02 января 2009

Да, используйте асинхронный делегат, как показано ниже:

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

0 голосов
/ 16 ноября 2009

Я вызываю пакет служб SSIS из своего пользовательского интерфейса (WPF) через асинхронный вызов службы WCF. Сервисный код:

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

И (часть) клиентского кода выглядит следующим образом:

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

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

Где BeginImportMarriageXML & EndImportMarriageXML - сгенерированные асинхронные операции в прокси-классе.

0 голосов
/ 02 января 2009

Вы спрашиваете, допустимо ли 1) вызывать LoadPackage в фоновом потоке или 2) возможно ли это. Для # 1 я не могу дать однозначный ответ, потому что я не использую инфраструктуру SSIS.

Однако # 2 (если # 1 верно) определенно выполнимо. ИМХО, вам лучше использовать существующую платформу, в которой есть API, предназначенные для вызова асинхронного API и ожидания результатов. Например, для CTP Parellel Extensions от 08 июня, подойдет следующий код.

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
0 голосов
/ 02 января 2009

Если вы просто хотите, чтобы он работал в фоновом режиме, тогда да, вы можете либо спулинить поток, либо вызвать T-SQL для динамического создания задания (и впоследствии удалить его снова). Если вы хотите запустить его асинхронно и хотите сделать обратный вызов, когда это будет сделано, то, к сожалению, вам не повезло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...