• 远程启动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();

    }

    运行结果如下:


     

  • 相关阅读:
    《从0开始学架构》——学习笔记(基础篇和高性能篇)
    Oracle的数据并发与一致性详解(下)
    Oracle的数据并发与一致性详解(上)
    关于oracle的缓冲区机制与HDFS中的edit logs的某些关联性的思考
    分布式锁的两种实现方式(基于redis和基于zookeeper)
    hadoop配置文件详解系列(二)-hdfs-site.xml篇
    hadoop配置文件详解系列(一)-core-site.xml篇
    【管理心得之四十六】你呀,少肺
    【管理心得之四十五】你呀,没心
    【管理心得之四十四】独立冲突之外,你做不到
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/2062371.html
Copyright © 2020-2023  润新知