在前面介绍的一篇文章中介绍了用代码启动SSIS包的方法,http://www.cnblogs.com/Farseer1215/archive/2010/11/08/1871464.html,其中第二种方法必须在安装了SSIS组件的服务器上运行.
如果这样处理的实用性不是很强,不可能在每一台客户机上都装一个SSIS组件,所以最好的办法是在安装了SSIS组件的服务器上安装一个服务,其他客户端调用即可,于是可以考虑用WCF写一个小程序来运行SSIS包,其他的客户端直接调用服务。
1.创建WCF服务
在VS2010中选择创建WCF服务库,这时VS会用WCF库的模板创建一个项目,配置文件,接口和类实现都已经创建好,唯一要做的是事情是实现自己的逻辑。
要想启动SSIS需要用到ManagedDTS这个类库,添加对Microsoft.SqlServer.ManagedDTS这个DLL 的引用。
在接口定义中定义相应的操作和数据契约,在类中实现这些接口,定义了如下两个方法:
{
SSISPackageResult result = new SSISPackageResult();
try
{
Application application = new Application();
Package package = application.LoadFromSqlServer(_packageName, " . " , null , null , null );
result.Execresult = package.Execute();
if (result.Execresult == DTSExecResult.Failure || result.Execresult == DTSExecResult.Canceled)
result.ExecInfo = string .Format( " SSIS包{0}运行失败,请查看包运行日志! " ,_packageName);
else
result.ExecInfo = string .Format( " SSIS包{0}运行成功 " ,_packageName);
}
catch (Exception ex)
{
result.Execresult = DTSExecResult.Failure;
result.ExecInfo = string .Format( " SSIS包{0}运行失败,具体异常信息为: " + ex.Message.ToString());
}
return result;
}
{
SSISPackageResult result = new SSISPackageResult();
try
{
Application application = new Application();
Package package = application.LoadFromSqlServer(_packageName, " . " , null , null , null );
package.Variables[_variableName].Value = _variableValue;
result.Execresult = package.Execute();
if (result.Execresult == DTSExecResult.Failure || result.Execresult == DTSExecResult.Canceled)
result.ExecInfo = string .Format( " SSIS包{0}运行失败,请查看包运行日志! " ,_packageName);
else
result.ExecInfo = string .Format( " SSIS包{0}运行成功 " ,_packageName);
}
catch (Exception ex)
{
result.Execresult = DTSExecResult.Failure;
result.ExecInfo = string .Format( " SSIS包{0}运行失败,具体异常信息为: " + ex.Message.ToString());
}
return result;
}
2.创建承载WCF服务的Windows服务
WCF服务的宿主可以是IIS,Windows Services,Windows Form甚至控制台命令程序,考虑到并不是所有服务器都会安装IIS,SRS2008也不再依赖于IIS,Windows Form和控制台命令程序控制起来不方便,所以采用Windows Services做为WCF服务的宿主程序。
在解决方案中加入一个新的项目WS_SSIS,项目模板采用Windows服务,添加对项目WCF_SSIS和System.ServiceModel的引用,在OnStart方法中添加启动WCF服务的代码:
serviceHost.Open();
因为System.Configuration不支持库的配置文件为服务增加一个配置文件,把WCF服务的配置文件内容拷贝过来。
为了安装服务,增加如下类,需要添加对程序集System.Configuration.Install的引用:
public class SSISServicesInstaller:Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public SSISServicesInstaller()
{
process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();
service.ServiceName = " SSIS Service " ;
service.Description = " 该服务用来执行SSIS包完成相应的数据整合任务 " ;
Installers.Add(process);
Installers.Add(service);
}
}
这样在用InstallUtil.exe安装服务时会自动添加相应的服务,在Win7或者Windows2008上安装服务时要注意使用管理员运行InstallUtil,否则会出错。
运行后会在服务中添加SSISService:
安装时让SSIS服务木运行在本地服务帐户下,可根据实际情况修改服务的运行帐户,让其可以正确访问SSIS,然后启动服务。
3.创建WCF客户端调用WCF服务完成操作
可以用多种方法来实现在AX中调用WCF服务,可以先用C#写个DLL,使用添加服务生成代理类,然后用代理类调用WCF服务,然后在AX中引用该DLL。AX2009也支持直接添加服务引用,自动生成代理类供调用WCF服务使用。
AOT->References->添加服务引用
填写正确的信息:
其中WSDL URL就是WCF向外提供服务的URL地址,具体的详细信息参见WCF的相关知识。
.NET 代码命名空间在AX生成的代理类的命名空间,这个可以按照自己的习惯随便取名。
点击确定:
这样正确生成了调用WCF服务需要的客户端程序。
4.调用服务
写一个类调用WCF服务
{
InterOpPermission interop = new InterOpPermission(InteropKind::ClrInterop);
SSISClient.ISSISServiceClient ssisServiceClient;
SSISClient.SSISPackageResult packageResult;
str bb;
;
interop.assert();
ssisServiceClient = new SSISClient.ISSISServiceClient();
packageResult = ssisServiceClient.ExecSSISPackage( " InventTable " );
info(packageResult.get_ExecInfo());
CodeAccessPermission::revertAssert();
}
运行结果如下: