質問

LoadPackage(...)を使用してSSISパッケージを呼び出しています。

この呼び出しを非同期呼び出しにすることは可能ですか?

役に立ちましたか?

解決

はい、ここに示すように非同期デリゲートを使用します:

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

他のヒント

バックグラウンドで実行したい場合は、はい、スレッドをスプールするか、T-SQLを呼び出してジョブを動的に作成します(その後、再び削除します)。非同期で実行し、完了時にコールバックが必要な場合は、残念ながら運が悪いと思います。

1)バックグラウンドスレッドでLoadPackageを呼び出すことが合法か、2)可能かを尋ねています。 #1については、SSISフレームワークを使用していないため、明確な答えを出すことができません。

ただし、#2(#1が真である限り)は間違いなく実行可能です。私見、APIの非同期を呼び出して結果を待つように設計されたAPIを備えた既存のフレームワークを使用する方が良いでしょう。たとえば、Parellel Extensions June 08 CTPの場合、次のコードで実行できます。

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

非同期WCFサービス呼び出しを介してUI(WPF)からSSISパッケージを呼び出しています。サービスコード:

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は、プロキシクラスで生成された非同期操作です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top