环境描述
我有一个从 asp.net 执行的 SSIS 任务,该包通过 UNC 路径从 excel 文件中获取数据,并将数据放入 sql server 数据库中。我已将 SSIS 部署到文件系统,它具有 Windows 身份验证数据库连接,并且 IIS 用户具有数据库访问权限。我可以作为用于托管 Web 应用程序的 AppPoolUser 登录并打开/修改有问题的文件,以便获得这些基本权限。Web App 是在 x86 中编译的。
当它工作时:
- 在我的用户或 appPool 用户下的服务器上的浏览器中从 Web 应用程序运行时
- 在通过 BIDS 运行的服务器上以我的身份登录时
- 在通过 BIDS 运行的服务器上以 AppPoolUser 身份登录时
- 使用 AppPoolUser 从服务器上的计划任务运行时
当它不起作用时:
- 从客户端浏览器运行时,即不是具有 IIS 托管 asp.net 应用程序的机器
我的问题
客户端和服务器有什么不同,我该如何让它工作?我的印象是,在运行 Web 应用程序时,所有连接都通过 AppPool 用户,所以它应该在包含的任何机器服务器上表现相同?
返回客户端浏览器的错误
SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。OLE DB 记录可用。来源:“Microsoft Office Access 数据库引擎”Hresult:0x80004005 描述:“Microsoft Office Access 数据库引擎无法打开或写入文件 '\\myserver\My folder\myfile.xlsx'。它已被其他用户以独占方式打开,或者您需要获得查看和写入其数据的权限。”。SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。对连接管理器“MyExcelFileConnection”的 AcquireConnection 方法调用失败,错误代码为 0xC0202009。在此之前可能会发布错误消息,其中包含有关 AcquireConnection 方法调用失败原因的更多信息。组件“Excel Source”(1) 验证失败并返回错误代码 0xC020801C。一个或多个组件验证失败。任务验证期间出现错误。
c#代码运行SSIS包
string pkgLocation;
Package pkg;
Application app;
DTSExecResult pkgResults;
string result = string.Empty;
string dtsErrors = string.Empty;
try
{
pkgLocation = packagePath;
app = new Application();
pkg = app.LoadPackage(pkgLocation, null);
pkgResults = pkg.Execute();
foreach (DtsError local_DtsError in pkg.Errors)
dtsErrors += " " + local_DtsError.Description;
result = pkgResults.ToString();
}
catch (Exception exception)
{
result = exception.Message;
}