• c#控制台調用SSIS包互传值


         有时候不仅仅需要在内部执行package包,多数情况下,是需要在外部进行调用,比如,需要一个批处理或者控制台程序进行外部调用SSIS包,而往往这个包所配置的连接字符串是经过加密处理的,所以当外部调用SSIS包的时候,一方面需要给包赋值连接字符串,一方面传递其他参数,其实给包赋值就是往包里传递参数。

         当遇到问题在网上进行查找解决方案的时候,有时候答案很零碎,或者只是部分代码,浅藏辄止,而有的处理方法都是很老的版本所用到的,所以这很鸡肋。当我写随笔时,总是反复修改,亲力亲为,确保完整代码,确保测试通过。虽然很基础,甚至没必要,权当自己是学习记录

    1. 先用VS2015建立一个最简单的SSIS包,设置一个包变量StrPram,初始值为VInitial,里面放入一个脚本组件,设置一个可写变量,选中之前设置的包变量StrPram,然后编辑脚本,让其弹出传进来的变量值

    如上图,直接在VS2015上测试是没有问题的,那么如果要在控制台调用这个包,针对SQL2014,需要引用 Microsoft.SQLServer.ManagedDTS.dll 组件,默认路径为:

      C:Program Files (x86)Microsoft SQL Server120SDKAssembliesMicrosoft.SQLServer.ManagedDTS.dll

    引用之后,再添加命名空间 using Microsoft.SqlServer.Dts.Runtime;

     2.新建控制台项目的代码如下:

            public static void RaadSSDT()
            {
                       
                Console.WriteLine("Start a read task for dts...");
                Application app = new Application();         
                try
                {               
                    string Path = @"D:FTESTpageISpro1ISpro1Package.dtsx";
                    //加载包
                    Package package = app.LoadPackage(Path, null);
                    //获取包结果
                    DTSExecResult result = package.Execute();               
                    //判断包执行结果
                    if (result.Equals(DTSExecResult.Success))
                    {
                        Console.WriteLine("Excute dts is success...");
                    }
                    else
                    {
                        Console.WriteLine("Excute dts is Failure..." + System.DateTime.Now.ToString()); 
                    }
                    Console.ReadLine();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }

    网上很多资料写的都是引用DTSRuntimeWrap.dll 组件,加载包用的也是

      DtsRunTime.IDTSPackage90 package = app.LoadPackage(Path, true, null);

    我想说的是 这是针对SQL2005的版本配置的方案,社会是向前发展的,再過兩天就是2017年,如今這些老旧的解决方案不能再帮助我们解决问题,只能是了解知识,在查找解决方案时,一定要关注版本,以免造成不必要的麻烦。

    3.验证

    程序的调试离不开状态的分析,当我在VS的设计模式运行包的时候,是没有问题的,但是我在控制台调用包的时候,返回结果result一直都是Failure,这就尴尬了,折腾了我一整天都没有搞明白,后来我又在SQL 集成服务中进行封装跑包验证,同样也是成功,没有问题,但是为何C#调用时失败,后来我写了一个foreach,输出失败信息

       if (result.Equals(DTSExecResult.Failure))
       {
           foreach (DtsError dtserr in pack.Errors)
            {
                Console.WriteLine(dtserr.Description);
             }             
         }
         else
         {
             Console.WriteLine("Sussess");
          }
         Console.ReadKey();

    运行的时候控制台提示如下:The JavaScript Task is Currupted... ,说是脚本组件损坏,VS2015设计模式跑包和SQL2014集成服务执行包是没有问题的,我又添加了一个Excute SQL Task组件,结果控制台输出的Description 为:

    最后绕了一大圈,终于证明问题还是出在控制台项目的版本上面,然后搜索错误代码,找到了这位园友的随笔 http://www.cnblogs.com/yujwshx/p/4519916.html,虽然只有寥寥数语,却指明了是因为 引用了SQL的命名空间,造成版本不一致,需要在控制台项目的配置文件中 设置属性 useLegacyV2RuntimeActivationPolicy 为 true:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
      </startup>
    </configuration>

    然后,启动控制台项目,果然在控制台得到:Success ,再一次证明了对程序本身而言,版本的重要性。

    4. 多数情况下不仅仅是调用SSIS包,还要往里面传值,或者从包里读取值,只要针对Variables["参数"]进行操作就好,前提是,这些参数在包中是设置好的,否则,系统会提示获取失败,找不到参数.所以在真正使用的时候,习惯上还是要进行一下判断(PS:当包加载成功,即可对其进行参数值的交互,即使最终的Result结果为:Failure)

    string iba = package.Variables["StrParam"].Value.ToString();    //VInitial 初始值
    // 給package中的變量進行賦值
    package.Variables["StrParam"].Value = "Sientuo";
    // 读取package中的變量值
    string ibb = package.Variables["StrParam"].Value.ToString();   //Sientuo  外部赋值后的值

    5.同理,在调用包时,如果是给包的连接管理器传递连接字符串的话,是对 Connections["数据源管理器名"].ConnectionString 进行操作,同样是要做好判断,是否存在

     //讀取配置文件中的鏈接字符串,并進行解密
     string con = ConfigurationManager.ConnectionStrings["dbConnStr_Temp"].ToString();
     string RealPwd = AddPwd.GetConDb(con);
     package.Connections["DBTest.sa"].ConnectionString = RealPwd;

    所谓的数据源管理器名,右键-添加连接源

     

    这个连接管理器功能非常强大,可以对很多数据进行配置,而操作SSIS离不开和数据打交道,其实大数据的核心ETL,就是对数据进行 抽取、转换、加载,而SSIS工具功能非常强大,可以为各种各样的数据交互提供平台,从而实现逻辑上的数据共享,构成人类社会的基单元是人,而人的各种行为都可以被当做数据进行存储,数据共享时代为我们带来便捷的同时,也让我们无处遁形,这是一个最好的时代。

    权当做学习记录

                              --市人皆大笑,举手揶揄之

  • 相关阅读:
    Mysql 数据库 表中列的操作
    FreeSWITCH版本更新
    shell脚本58问
    Wireshark 与 Tcpdump
    Mysql 中 int(3) 和 int(11) 的区别
    FreeSWITCH 基础
    FreeSWITCH 学习笔记(一)
    Mysql 复制表数据(表结构相同)
    Centos date 设置自定义时间
    Mysql 主键
  • 原文地址:https://www.cnblogs.com/Sientuo/p/6207585.html
Copyright © 2020-2023  润新知