[SQL SERVER][SSIS]利用 C# 動態設定封裝組態檔案

  • 2836
  • 0
  • C#
  • 2013-03-31

[SQL SERVER][SSIS]利用 C# 動態設定封裝組態檔案

啟用封裝組態檔也是我個人常使用的方式,一般我會使用C#來執行相關SSIS Package,

主要是因為連線字串密碼問題。

 

SSIS2012 可以透過下面方式啟用封裝組態

image

image

 

封裝組態XML結構如下

image

組態檔案中不儲存password...等敏感資料。

 

因為不包含連線字串登入使用者密碼,所以執行時會出現登入資料庫失敗錯誤

image

 

我們可以在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();

 

 

 

執行結果

image

 

 

 

參考

[SQL SERVER][SSIS]利用 C# 執行 SSIS並傳遞變數