SSIS ->> Script Task
利用Script Task,我们可以做一些本身SSIS没能满足我们的,或者实现起来效果不够理想的。比如说我们想做一件这样的事情,去检查某个文件是否为空。如果我们通过Row Count组件来实现,性能上不理想,因为我又并不需要要知道究竟文件包含多少行数据。我们只需要简单地知道文件是否包含数据。我们可以通过写C#代码,去调用BinaryStream的方法来读取该文件的前几行就可以确定是否文件包含数据。总的来说,Script Task能做事情分几类:1) 读取和改变包的变量;2)读取包的属性;3)用C#或者VS代码实现业务逻辑,做有一些验证检查工作;4)控制workflow的执行;
上面说到的那个检查数据文件是否为空的例子,我们可以把这样的C#代码放到一个统一的项目中,然后编译生成DLL库(Assembly),再加载到Script Task里面(或者说被引用),这样可以减少代码的重复。
Script Task中的DTS对象其实是对Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel的实例化。它包含了一下的成员:
1) Connections:可以引用Package的Connection Managers
2) Events:可以引用Package的Events
3) ExecutionValue:
4) TaskResult:可以用来手动指定成功(success)或者失败(failure)
5) Transaction
6) VariableDispenser:可以用来获取包的Variables
7) Variables:可以用来存储Varibales
8) Log:写log
引用SSIS包的变量: Dts.Variables[“User::SomeStringVariable”].Value = “MyValue”;
改变包的变量Dts.Variables[“User::HappyPathEnum”].Value = 1;
改变TaskResult属性来告诉SSIS的包当前组件任务的执行是成功还是失败了,从而影响后面整个workflow的执行
Dts.TaskResult = (int)ScriptResults.Success;
VariableDispenser提供了锁定变量的方法可以防止在解除锁定该变量被改变
Dts.VariableDispenser.LockForRead("SomeVariable")
Dts.VariableDispenser.GetVariables(vars)可以把当前包的variables赋给某个variables集合
尝试从Variables集合中读取没有赋制值的变量将会抛出异常
Script Task对变量是大小写敏感的,必须把要再script代码中用到变量设置到ReadOnlyVariables或ReadWriteVariables
下面是一个Script Task连接DataSource的例子:
public void Main()
{
string myPackageId = Dts.Variables[“System::PackageID”].Value.ToString();
string myValue = string.Empty;
string cmdString = “SELECT VALUE FROM SSIS_SETTING “ +
“WHERE PACKAGE_ID= @PACKAGEID And SETTING= @SETTINGID”;
try
{
SqlConnection mySqlConn =
(SqlConnection)Dts.Connections[0].AcquireConnection(null);
mySqlConn = new SqlConnection(mySqlConn.ConnectionString);
mySqlConn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = cmdString;
SqlParameter parm = new SqlParameter(“@PACKAGEID”, SqlDbType.UniqueIdentifier);
parm.Value = new Guid(myPackageId);
cmd.Parameters.Add(parm); parm = new SqlParameter(“@SETTINGID”,
SqlDbType.NVarChar);
parm.Value = “LOGFILEPATH”;
cmd.Parameters.Add(parm);
cmd.Connection = mySqlConn;
cmd.CommandText = cmdString;
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
myValue = reader[“value”].ToString();
}
Dts.Variables[“User::LOGFILEPATH”].Value = myValue;
reader.Close();
mySqlConn.Close();
mySqlConn.Dispose();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
System.Windows.Forms.MessageBox.Show(myValue);
Dts.TaskResult = (int)ScriptResults.Success;
}
下面是Script Task从FTP Server拿数据的例子:
ConnectionManager conn = default(ConnectionManager);
FtpClientConnection ftp = default(FtpClientConnection);
string[] folderNames = null;
string[] fileNames = null;
ArrayList fileArray = new ArrayList();
conn = Dts.Connections(“FTPServer”);
ftp = new FtpClientConnection(conn.AcquireConnection(null));
ftp.Connect();
ftp.GetListing(folderNames, fileNames);
foreach (string s in fileNames) {
fileArray.Add(s);
}
Dts.Variables(“FileList”).Value = fileArray;
ftp.Close();
Dts.TaskResult = ScriptResults.Success;
下面是Script Task写入数据到XML文件的例子:
public void Main()
{
SqlConnection sqlConn;
string cmdString = “SELECT * FROM SSIS_SETTING “;
try
{
sqlConn = (SqlConnection)(Dts.Connections[“AdventureWorks”])
.AcquireConnection(Dts.Transaction
);
sqlConn = new SqlConnection(sqlConn.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(cmdString, sqlConn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(new System.IO.StreamWriter
(“C:\\ProSSIS\\Files\\myPackageSettings.xml”));
sqlConn.Close();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
下面是Script Task序列化数据再写入到XML文件的例子:
public void Main()
{
SqlConnection sqlConn;
string cmdString = “SELECT * FROM SSIS_SETTING “;
try
{
sqlConn = (SqlConnection)(Dts.Connections[“AdventureWorks”])
.AcquireConnection(Dts.Transaction
);
sqlConn = new SqlConnection(sqlConn.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(cmdString, sqlConn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(new System.IO.StreamWriter
(“C:\\ProSSIS\\Files\\myPackageSettings.xml”));
sqlConn.Close();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
用XMLSerializer类来序列化XML数据
[Serializable()]
public class SSISSetting
{
public string PackageId { get; set; }
public string Setting { get; set; }
public string Value { get; set; }
}
public void Main()
{
SqlConnection sqlConn;
string cmdString = “SELECT * FROM SSIS_SETTING “;
try
{
sqlConn = (SqlConnection)(Dts.Connections[“AdventureWorks”])
.AcquireConnection(Dts.Transaction);
sqlConn = new SqlConnection(sqlConn.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(cmdString, sqlConn);
SqlDataReader dR = cmd.ExecuteReader();
List<SSISSetting> arrayListSettings = new List<SSISSetting>();
while (dR.Read())
{
SSISSetting oSet = new SSISSetting();
oSet.PackageId = dR[“PACKAGE_ID”].ToString();
oSet.Setting = dR[“SETTING”].ToString();
oSet.Value = dR[“VALUE”].ToString();
arrayListSettings.Add(oSet);
}
StreamWriter outfile = new StreamWriter
(“C:\\ProSSIS\\Files\\myObjectXmlSettings.xml”);
XmlSerializer ser = new XmlSerializer(typeof(List<SSISSetting>));
ser.Serialize(outfile, arrayListSettings);
outfile.Close();
outfile.Dispose();
sqlConn.Close();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
我们也可以手工触发Event Handler
public void Main()
{
string taskName = Dts.Variables[“System::TaskName”].Value.ToString();
bool retVal = false;
Dts.Events.FireInformation(0, taskName, String.Format
(“Starting Loop Operation at {0} “,
DateTime.Now.ToString(“MM/dd/yyyy hh:mm:ss”)), “”, 0,
ref retVal);
for(int i=0; i <= 10; i++)
{
Dts.Events.FireProgress(String.Format(”Loop in iteration {0}”, i),
i * 10, 0, 10, taskName, ref retVal);
}
Dts.Events.FireInformation(0, taskName, String.Format(”Completion Loop Operation
at {0} ”, DateTime.Now.ToString(”mm/dd/yyyy hh:mm:ss”)), ””, 0, ref retVal);
Dts.Events.FireWarning(1, taskName, ”This is a warning we want to pay attention
to...”, ””, 0);
Dts.Events.FireWarning(2, taskName, ”This is a warning for debugging only...”,
””, 0);
Dts.Events.FireError(0, taskName, ”If we had an error it would be here”, ””, 0);
}
SSIS ->> Script Task的更多相关文章
- 转 Refresh Excel Pivot Tables Automatically Using SSIS Script Task
Refresh Excel Pivot Tables Automatically Using SSIS Script Task https://www.mssqltips.com/sqlservert ...
- ssis的script task作业失败(调用外部dll)
原文 ssis的script task作业失败 我的ssis作业包里用了一个script task,会查询一个http的页面接口,获取json数据后解析然后做后续处理,其中解析json引用了本地目录下 ...
- 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件
原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...
- Script Task 引用 package variable
Script Task 能够使用C#代码进行编程,许多复杂的逻辑都可以使用C# 脚本来实现,不仅灵活,而且强大. 1,能够传递package variable 给 Script Task ,并且Scr ...
- SSIS ->> Script Debugging and Troubleshooting
Breakpoint是调试过程中最重要的手段,不仅对于Script Task和Script Component,对于任何其他的组件也是如此.可以在某个Event(如OnError)触发的时候设置断点来 ...
- 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数
开篇语 在这篇日志中 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 我介绍到了包级别的日志管理框架,那么这个主要是针对包这一个层级的 Log 信息,包括包开始执行和结束时间,以 ...
- 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug
开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...
- 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧
开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...
- SSIS之-DTS对象&事件
1.Dts 是类 Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel 类的一个实例,Dts 对象有 7 个属性和一个方法,以下是DTS ...
随机推荐
- PE格式的理解(待补充)
PE文件格式 一.基本结构 1.DOS头一般到节区头成为PE头部分,其下称为PE体.文件的内容一般可分为代码(.text).数据(.data).资源(.rsrc),分别保存. 2.PE头与各节区的尾部 ...
- adb怎么判断是否有root权限,并更改system/app内容
一.首先判断root权限: adb root 结果: C:\signapp>adb root restarting adbd as root # 说明有root权限 ,若是adbd cannot ...
- html5 drag api详解
可以夸张点说,如果你不会拖拽,你不是一个合格的前端开发. 回想下,以前我们是怎么实现拖拽的,主要有以下几步: 1.目标元素绑定mousedown事件,记录下此时鼠标位置和拖拽元素的位置差,分别是 di ...
- MySQL中求年龄
时间函数: 1.curdate() --- 当前系统日期 调取: select curdate() 2.curtime() --- 当前系统时间 调取: select curtime() 3.now( ...
- HDU 5446 Unknown Treasure Lucas+中国剩余定理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...
- 【CentOS】IBM X3650M4 IMM远程管理【转载】
问题描述: IBM X3650M4 IMM远程开机和关机 参考资料: http://www.ibmsys.cn/blog/?p=201 问题解决: 一 ...
- 【BZOJ】【3439】Kpm的MC密码
Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀 ...
- NYOJ-214 单调递增子序列(二) AC 分类: NYOJ 2014-01-31 08:06 233人阅读 评论(0) 收藏
#include<stdio.h> #include<string.h> int len, n, i, j; int d[100005], a[100005]; int bin ...
- CSS3弹性盒模型,Flex布局教程
布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. CSS3中引入flex的弹性盒模型 ...
- 关闭WordPress自动加载的Open Sans字体-WP访问过慢原因
序言 wordpress大概从wp-3.8开始会自动加载Open Sans字体,并引用Google上面的CSS样式.而最近谷歌经常打不开,导致网站访问速度过慢,严重的会拖慢几十秒.Open Sans字 ...