SSISパッケージを非同期的に呼び出す
-
03-07-2019 - |
質問
LoadPackage(...)を使用してSSISパッケージを呼び出しています。
この呼び出しを非同期呼び出しにすることは可能ですか?
解決
はい、ここに示すように非同期デリゲートを使用します:
他のヒント
バックグラウンドで実行したい場合は、はい、スレッドをスプールするか、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は、プロキシクラスで生成された非同期操作です。
所属していません StackOverflow