从 ASP.NET 执行 SSIS 包时出错

Posted

技术标签:

【中文标题】从 ASP.NET 执行 SSIS 包时出错【英文标题】:Error executing SSIS package from ASP.NET 【发布时间】:2012-06-11 23:52:24 【问题描述】:

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

这里是调用 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 使用服务帐户运行。两种情况下的行为相同。

【问题讨论】:

【参考方案1】:

开发盒和服务器的架构有区别吗?

请务必注意,如果您在 32 位环境中开发包并希望在 64 位环境中运行该包,则连接管理器需要与 64 位兼容。某些连接管理器(例如 Excel)只能在 32 位环境中工作。

【讨论】:

【参考方案2】:

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

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

希望这是解决方案。

【讨论】:

【参考方案3】:

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

第一:

您的 SSIS 包是否启用了错误日志记录?我打开它,只是为了 OnError 事件。这将在数​​据库中创建一个名为 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)

我希望这会有所帮助。

【讨论】:

以上是关于从 ASP.NET 执行 SSIS 包时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL SERVER 上使用 ODBC 连接执行 SSIS 包时出错

将消息从 SSIS (2012) 包推送到 ASP.NET Web 应用程序中的 SignalR 集线器——最好的方法是啥?

C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值

处理 ASP.NET 中长时间运行的进程

解决 ASP.NET Chart 控件出错 为 ChartImg.axd 执行子请求时出错

为啥从目录执行 ssis 包时访问文件路径被拒绝消息