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

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

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

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

C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.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:\ZF\TESTpage\ISpro1\ISpro1\Package.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工具功能非常强大,可以为各种各样的数据交互提供平台,从而实现逻辑上的数据共享,构成人类社会的基单元是人,而人的各种行为都可以被当做数据进行存储,数据共享时代为我们带来便捷的同时,也让我们无处遁形,这是一个最好的时代。

权当做学习记录

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

c#控制台調用SSIS包互传值的更多相关文章

  1. SQL Server Integration Services(SSIS) 包配置与部署

    SSIS配置此处的配置方式,主要针对到正式服务器上要修改服务器名,和连接服务器等配置注意:1. 包配置在windows2008上生成后,在windows2003上mysql的配置无法使用,总是报错连接 ...

  2. 总结运行SSIS包的几种方式

    方式一: 在BIDS里直接跑. 这个BIDS指的就是SQL Server Business Intelligence Development Studio,对于.net开发者来说它就是Visual S ...

  3. 在SSIS包中的事务处理

    在处理SSIS包的数据ETL操作过程中,我们经常遇到的一个问题就是一系列步骤在运行的过程中,如果中间的一个步骤失败了,那么我们就需要清理前面已经运行过的步骤所产生的数据或者结果,这往往是一个很头疼的过 ...

  4. 变量在SSIS包中的使用

    2010~2011年经常使用SSIS包采集加工数据,后来换了工作就很少使用.最近又开始用那玩意采集数据,努力回想之前是怎样操作的,网上各种找各种纠结.趁这次使用记录下日常操作步骤,以备以后不时之需. ...

  5. SQLServer 数据导入导出 SSIS 包 位置

    笔记:sqlserver 在执行数据导入导出的时候,可以选择是否保存SSIS包,如果选择保存,在保存方式有:SQlserver .文件系统.如果选择sqlserver 则 包信息保存在 msdb 系统 ...

  6. 维护计划生成的SSIS包存储在哪

    首先理解导入导出包的基本概念:http://technet.microsoft.com/zh-cn/library/ms141772(v=SQL.110).aspx包既可以保存在SQL Server ...

  7. SSIS包部署

    1.ssis包部署可以生成部署文件,部署到sqlserver,再通过sqlserver计划作业来执行. 2.也可以通过shell来调用dtsx ,通过windows计划任务来定时调用exe. 不论是哪 ...

  8. SSIS包配置动态配置数据库连接

    动态连接数据库便于维护 用SSIS包配置实现 1.控制流页签 - 右键 - 包配置 2.配置xml文件 3.指定连接属性:ServerName.UserName.Password 测试: 1.配置错误 ...

  9. C#调用SSIS包及读取DataReader目标

    C#调用SSIS包需要引用两个DLL .(具体位置在C盘搜索,MSDN和百度提供的路径都不太正确) Microsoft.SQLServer.ManagedDTS.dll Microsoft.SqlSe ...

随机推荐

  1. centos建立回收站

    linux下的回收站在每一个当前用户目录./local/share/Trash中. 也可以给linux添加一个回收站. mkdir /tmp/trash_tmp 建立一个回收站目录 vi /bin/t ...

  2. 《实战Java虚拟机》,最简单的JVM入门书,京东活动,满200就减100了,该出手了

    #京东满200—100单# 图书放血大卖了 <实战Java虚拟机>http://item.jd.com/11670385.html 参加京东满200减 100的大促,就在6.1这一天,仅此 ...

  3. 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  4. Neil·Zou 语录三

    1 人的大脑,假设100分成熟.那么每个人大脑达到100分的时间点不同.有些人因为外界因素在读书时就达到了,而有些人到工作后才达到.但很可惜,很多国人进入社会后就不学习了.所以说,工作后保持激情.好奇 ...

  5. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  6. IO口

    STM32的每个IO端口都有7个寄存器来控制.他们是:CRH CRL IDR ODR BSRR BRR LCKR.我们常用的IO端口寄存器位CRL CRH IDR ODR.CRL CRH控制着每个IO ...

  7. linux下常见的字符串处理

    linux下有许多对字符串文本的处理工具,diff,grep,awk,sed等等.. diff 比较两个文件的不同 [root@bogon diff]# diff file1 file2 以高亮的形式 ...

  8. Redis学习笔记(3)-Hash

    package cn.com; import java.util.HashMap; import java.util.List; import java.util.Map; import java.u ...

  9. 在使用Intelligencia.UrlRewriter过程中 中文乱码问题

    由于业务需求,最近将项目部分模块修改为伪静态,使用到了Intelligencia.UrlRewriter.dll组件. 网上对使用Intelligencia.UrlRewriter.dll的配置讲解很 ...

  10. Python学习【第五篇】循环语句

    Python循环语句 接下来将介绍Python的循环语句,程序在一般情况下是按顺序执行的. 编程语言提供了各种控制结构,允许更复杂的执行路径. 循环语句允许我们执行一个语句或语句组多次. Python ...