利用Script Task,咱们能够作一些自己SSIS没能知足咱们的,或者实现起来效果不够理想的。好比说咱们想作一件这样的事情,去检查某个文件是否为空。若是咱们经过Row Count组件来实现,性能上不理想,由于我又并不须要要知道究竟文件包含多少行数据。咱们只须要简单地知道文件是否包含数据。咱们能够经过写C#代码,去调用BinaryStream的方法来读取该文件的前几行就能够肯定是否文件包含数据。总的来讲,Script Task能作事情分几类:1) 读取和改变包的变量;2)读取包的属性;3)用C#或者VS代码实现业务逻辑,作有一些验证检查工做;4)控制workflow的执行;sql
上面说到的那个检查数据文件是否为空的例子,咱们能够把这样的C#代码放到一个统一的项目中,而后编译生成DLL库(Assembly),再加载到Script Task里面(或者说被引用),这样能够减小代码的重复。app
Script Task中的DTS对象实际上是对Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel的实例化。它包含了一下的成员:oop
1) Connections:能够引用Package的Connection Managers
2) Events:能够引用Package的Events性能
3) ExecutionValue:ui
4) TaskResult:能够用来手动指定成功(success)或者失败(failure)debug
5) Transactionorm
6) VariableDispenser:能够用来获取包的Variablesxml
7) Variables:能够用来存储Varibales
对象
8) Log:写logip
引用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 Operationat {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 attentionto...”, ””, 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);}