有时候不仅仅需要在内部执行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. 轻量级队列beanstalkd

    一.基本Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Face ...

  2. nginx安装waf防护

    一.安装nginx 二.安装luajit2.0 三.安装ngx_devel_kit#wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.1 ...

  3. 浅谈iOS开发中方法延迟执行的几种方式

    Method1. performSelector方法 Method2. NSTimer定时器 Method3. NSThread线程的sleep Method4. GCD 公用延迟执行方法 - (vo ...

  4. scala中的数组的转换操作

    1.共有两种操作 转换成一种新的数组 2.yield转换 3.函数式编程转换

  5. PMP--综合考试知识点,持续更新中。。。

    1]盈亏平衡点=固定成本/(销售价格-可变成本). 2]项目管理(Project Management): 就是把各种知识.技能.手段和技术应用于项目活动之中,以达到项目的要求. 3]有效的管理要求项 ...

  6. linux 技巧:使用 screen 管理你的远程会话

    你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远程终 ...

  7. [转]AS3 int uint Number

    转自:http://luhantu.iteye.com/blog/1910301 AS3 int uint Number 博客分类: AS3 flex number 类型  1) int 类可使用表示 ...

  8. Quartz2D 编程指南(一)概览、图形上下文、路径、颜色与颜色空间

    概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 0.说明 本篇博客主要是对官方文档 ...

  9. JSON字符串与JSON对象的区别

    Q:什么是"JSON字符串",什么是"JSON对象",两者的区别? a.JSON对象是直接可以使用JQuery操作的格式,如C#中可以用对象(类名)点出属性(方 ...

  10. 【转载】Mysql 查看连接数,状态

    转载地址:http://blog.csdn.net/starnight_cbj/article/details/4492555 命令: show processlist; 如果是root帐号,你能看到 ...