Farseer

导航

远程启动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, "."nullnull,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, "."nullnull,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();

}

运行结果如下:


 

posted on 2011-06-01 09:43  佛西亚  阅读(1558)  评论(1编辑  收藏  举报