从 ASP.NET 执行 SSIS 包时出错
本文关键字:包时 出错 SSIS 执行 ASP NET | 更新日期: 2023-09-27 18:36:41
从 ASP.NET 运行 SSIS 包时,我们在部署网站时遇到问题。 我们已将包加载到 MSDB 中的集成服务服务器中。 当我们从SQL Server Management Studio尝试该包时,它会正常运行。 当我从 Visual Studio 执行代码时,服务器中加载的包可以正常运行。 将页面部署到服务器时会出现此问题:没有捕获异常,也没有记录任何错误,但包不会执行。 我们只是在 Windows 事件查看器中看到一个错误,说:"包"失败。 ASP.NET 页面模拟对 SQL Server 以及源 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。 这两种方案的行为相同。
开发盒和服务器的体系结构是否有差异?
请务必注意,如果在 32 位环境中开发包,并希望在 64 位环境中运行包,则连接管理器需要符合 64 位。某些连接管理器(如 Excel)仅在 32 位环境中工作。
我不确定这个问题的确切答案,但是,我有一个值得检查的建议。 SSIS 包是安装到 SQL Server DB 还是文件系统,因为每个包都需要不同的方法来访问包。
http://consultingblogs.emc.com/jamiethomson/archive/2006/02/20/ssis_3a00_-deploy-to-file-system-or-sql-server.aspx
希望这是解决方案。
您的主要问题是缺少错误报告。
第一:
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)
我希望这有所帮助。