从ASP.NET执行SSIS包时出错

时间:2012-06-07 21:20:09

标签: c# asp.net ssis integration

我们在部署网站时从ASP.NET运行SSIS包时遇到问题。我们在MSDB中的Integration Services服务器中加载了包。当我们从SQL Server Management Studio尝试包时,它可以正常运行。当我从Visual Studio执行代码时,服务器中加载的包正常运行。将页面部署到服务器时会出现问题:没有捕获异常且未记录任何错误,但程序包未执行。我们只是在Windows事件查看器中看到一条错误:“程序包”“失败了”。 ASP.NET页面运行模拟具有对SQL Server的“sysadmin”访问权限的帐户以及源Excel文件所在的共享。

以下是调用SSIS包的代码:

    public void executePkg(string pkgAddr, string pkgServer, int periodID)
    {
        logger.Info(string.Format("Execution of SSIS Package '{0}' in server '{1}' started.", pkgAddr, pkgServer));
        string pidvar = "User::periodid";
        string pkgLocation;
        Package pkg;
        Application app;
        DTSExecResult pkgResults;
        app = new Application();
        pkgLocation = pkgAddr;
        try
        {
            pkg = (Package)app.LoadFromSqlServer(pkgAddr, pkgServer, null, null, null);
            Variables vars = pkg.Variables;
            int varCount = vars.Count;
            bool varExist = vars.Contains(pidvar);
            pkg.VariableDispenser.LockOneForWrite(pidvar, ref vars);
            vars[pidvar].Value = periodID;
            pkg.Variables[pidvar].Value = periodID;
            vars.Unlock();
            pkgResults = pkg.Execute();
        }
        catch (Exception ex)
        {
            logger.Error(ex.Message);
        }
    }

任何帮助都将不胜感激。

注意:只是一个小小的更正,ASP.NET不再模仿,而是AppPool与服务帐户一起运行。两种情况的行为都是一样的。

3 个答案:

答案 0 :(得分:1)

开发盒和服务器的架构是否存在差异?

请务必注意,如果在32位环境中开发软件包并希望在64位环境中运行软件包,则连接管理器需要符合64位标准。某些连接管理器(如Excel)仅在32位环境中工作。

答案 1 :(得分:0)

我不确定这个问题的确切答案,但是,我有一个值得检查的建议。 SSIS包是安装到SQL Server数据库还是文件系统,因为每个包都需要不同的方式来访问包。

http://consultingblogs.emc.com/jamiethomson/archive/2006/02/20/ssis_3a00_-deploy-to-file-system-or-sql-server.aspx

希望这是解决方案。

答案 2 :(得分:0)

似乎您的主要问题是缺少错误报告。

首先:

您的SSIS包是否启用了错误记录?我打开它,仅用于OnError事件。这将在db中创建一个名为sysssislog的表,并在那里写入错误(以及您选择的任何其他日志)。

https://technet.microsoft.com/en-us/library/ms138020%28v=sql.105%29.aspx

值得注意:当我这样做时,SSIS会创建一个名为domain \ username.sysssislog的表而不是dbo.sysssislog。如果您的包执行此操作,您只需要删除错误命名的表并创建dbo.sysssislog,以便包可以在那里写入错误。

第二

由于您使用对象模型来执行包,因此您可以从包中捕获错误并对其执行某些操作。对于调试,我只是在消息窗口中弹出它们,这样我就可以看到问题所在。

我就是这样做的,但我不确定它是不是很好用:

            Dim errReport As String
            Dim errors As DtsErrors = pkg.Errors

            Dim errItem As Boolean = errors.Contains(0)

            errReport = "No Error"
            If (errItem) Then
                Dim firstEItem As DtsError = errors(0)
                Dim ex As New Exception("The file could not be loaded. Please submit a helpdesk ticket.")
                Throw ex
                errReport = "The following error occurred: " + firstEItem.Description
            End If


            MsgBox(errReport, MsgBoxStyle.OkOnly, pkgResults.ToString)

我希望这会有所帮助。

相关问题