[SQL SERVER][SSIS]利用 C# 動態設定封裝組態檔案
啟用封裝組態檔也是我個人常使用的方式,一般我會使用C#來執行相關SSIS Package,
主要是因為連線字串密碼問題。
SSIS2012 可以透過下面方式啟用封裝組態
封裝組態XML結構如下
組態檔案中不儲存password...等敏感資料。
因為不包含連線字串登入使用者密碼,所以執行時會出現登入資料庫失敗錯誤
我們可以在runtime階段修改XML,並在結束後清空相關密碼,程式碼如下
string pkgLocation;
Package pkg;
Application app;
DTSExecResult pkgResults;
MyEventListener eventListener;
//Variables vars;
string appDirectory = Path.GetDirectoryName(
Assembly.GetExecutingAssembly().Location.ToString());
//讀取封裝組態檔案
XDocument pkgxdc = XDocument.Load(string.Format(@"{0}\Package.dtsConfig", appDirectory));
var datas = from data in pkgxdc.Descendants("Configuration")
select data;
foreach (var data in datas)
{
var attritems = from attritem in data.Attributes()
select attritem;
foreach (var at in attritems)
{
if (at.Name.ToString().ToUpper() == "PATH" && at.Value.Contains("Password"))
{
data.Element("ConfiguredValue").SetValue("登入密碼");//寫入密碼 break;
}
}
}
pkgxdc.Save(string.Format(@"{0}\Package.dtsConfig", appDirectory));
XDocument xdoc = XDocument.Load(string.Format(@"{0}\SSISData.xml", appDirectory));
var items = from item in xdoc.Descendants("Item")
select item;
string pkgpath = string.Empty;
string pkgname = string.Empty;
foreach (var item in items)
{
pkgpath = item.Element("FilePath").Value;
pkgname = item.Element("FileName").Value;
eventListener = new MyEventListener();
pkgLocation = pkgpath + pkgname;
app = new Application();
app.PackagePassword = "1234"; //設定Package密碼
pkg = app.LoadPackage(pkgLocation, eventListener);
pkg.EnableConfigurations =true;
//匯入封裝組態檔案
pkg.ImportConfigurationFile(string.Format(@"{0}\Package.dtsConfig", appDirectory));
//vars = pkg.Variables;
//vars["strtype"].Value = value; //設定 SSIS 變數
pkgResults = pkg.Execute(null, null, eventListener, null, null);
#region 清除連線字串密碼
foreach (var data in datas)
{
var attritems = from attritem in data.Attributes()
select attritem;
foreach (var at in attritems)
{
if (at.Name.ToString().ToUpper() == "PATH" && at.Value.Contains("Password"))
{
data.Element("ConfiguredValue").SetValue(""); break;
}
}
}
pkgxdc.Save(string.Format(@"{0}\Package.dtsConfig", appDirectory));
#endregion
Console.WriteLine(string.Format("執行結果:{0}", pkgResults.ToString()));
Console.ReadKey();
執行結果
參考