远程启动SSIS包

在前面介绍的一篇文章中介绍了用代码启动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 的引用。

在接口定义中定义相应的操作和数据契约,在类中实现这些接口,定义了如下两个方法:

public  SSISPackageResult ExecSSISPackage( string  _packageName)
        {
            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;
        }

 

public  SSISPackageResult ExecSSISPackageWithParam( string  _packageName,  string  _variableName,  string  _variableValue)
        {
            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 serviceHost  =   new  ServiceHost( typeof (SSISService));
            serviceHost.Open();

因为System.Configuration不支持库的配置文件为服务增加一个配置文件,把WCF服务的配置文件内容拷贝过来。

为了安装服务,增加如下类,需要添加对程序集System.Configuration.Install的引用:

[RunInstaller( true )]
    
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服务

static  server  void  main(Args _args)
{
    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();

}

运行结果如下:


 

转载于:https://www.cnblogs.com/Farseer1215/archive/2011/06/01/2062371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值