【问题标题】:Deploying SSIS Package to Server Causes Error将 SSIS 包部署到服务器会导致错误
【发布时间】:2016-01-13 08:40:22
【问题描述】:

我已经开发了一个 C# 控制台应用程序项目来运行一个 SSIS 包,并且我正在使用 .Net DTS 库来执行:

using Microsoft.SqlServer.Dts.Runtime;
.
.
var app = new Application();
var package = app.LoadPackage(@"ACE.dtsx", null);
package.Execute();
foreach (var error in package.Errors)
{
   logger.Error(error.ErrorCode + " " + error.Description);
}

这一切都在 Visual Studio 本地工作,执行包时没有报告任何错误。

但是,当我部署到安装了 SQL Server 配置管理器验证的集成服务以及显示 SQL Server 集成服务的 Windows 服务的服务器时,我收到了不同的错误,具体取决于我是在 x86 还是 x64/Any CPU 平台上部署。

x86

当我将 .Net 库设置为构建为 x86 并进行部署时,出现以下错误:

var app = new Application();

错误:主控制流期间发生错误 Microsoft.SqlServer.Dts.Runtime.DtsComException:找不到集成服务类。确保在运行应用程序的计算机上正确安装了集成服务。此外,如果您正在运行 64 位应用程序,请确保安装了 64 位版本的 Integration Services。 ---> System.Runtime.InteropServices.COMException:检索具有 CLSID {C3EC6BC0-D544-47D5-A0F2-2825E47DBE24} 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(来自 HRESULT 的异常:0x80040154( REGDB_E_CLASSNOTREG))。 在 Microsoft.SqlServer.Dts.Runtime.Application..ctor()

这似乎表明它在服务器上找不到集成服务或库。这对我来说很有意义,因为服务器运行的是 64 位 Windows 和 64 位 SQL Server。

x64/任何 CPU

如果我使用 x64 或任何 Cpu 平台进行部署,错误将变为:

错误:主控制流期间发生错误 System.BadImageFormatException:无法加载文件或程序集“Microsoft.SqlServer.DTSRuntimeWrap,版本=12.0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91”或其依赖项之一。试图加载格式不正确的程序。 文件名:'Microsoft.SqlServer.DTSRuntimeWrap, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'

这对我来说没有意义,因为库现在是与服务器匹配的 64 位。

环境

本地:

  • Windows 7 x64
  • SQL Server 2014 Enterprise Edition 64 位,安装了包括集成在内的所有服务。
  • 安装了适用于商业智能的数据工具的 Visual Studio 2013

服务器:

  • Windows Server 2012 x64
  • 带有集成服务的 SQL Server 2012 x64。我不确定如何查看确切的版本,因为没有本地数据库实例可以运行“SELECT @@Version”。
  • 数据库托管在其他地方。此服务器主要用于运行计划任务以在该数据库上执行 SSIS 包。

我打算在本地安装 SQL Server 2012,所以我的版本与服务器匹配,但后来我意识到重要的不是那个版本,而是商业智能的 Visual Studio Data Tools,因为它给了我 .Net 包装类和迄今为止正如我所知道的,我无法选择 VS2013 使用哪个版本。此外,这肯定与旧的 SQL Server 版本兼容。

商业智能数据工具是一个 x86 安装程序,但我被引导相信这纯粹是因为 Visual Studio 作为 x86 运行并且不影响 x64 运行时支持。

如何成功部署?

【问题讨论】:

  • 您的包中是否包含任何 32 位对象?也许 Excel 作为数据源?
  • 我看不到,但数据流中有很多。有确定的检查方法吗? SSIS 包是前段时间由其他人编写的,所以我只是编写了控制台项目以更改我们执行它的方式。它曾经通过直接调用“C:\Program Files\Microsoft SQL Server\110\DTS\Binn\dtexec.exe”命令在同一台服务器上执行。 Connections Managers 显示了 3 个 ADO.Net 连接和 OLEDB 连接以及一个 SQLTask。
  • 您可以检查本地的工作副本是否在 32 位模式下运行。从 Visual Studio Project > Project Name Properties... 这将打开属性对话框。检查调试选项卡上的 Run64BitRuntime 设置。如果设置为 false,您的包需要在 32 位模式下运行。部署包时,此选项卡中的设置不会从 Visual Studio 传输。它们需要在运行时显式设置。
  • @destination-data 该设置为真,因此它应该作为 64 位应用程序进行调试。

标签: .net sql-server ssis business-intelligence


【解决方案1】:

发展

  • SQL Server 2014 Enterprise Edition 64 位,安装了包括集成在内的所有服务。

服务器

  • 带有集成服务的 SQL Server 2012 x64

调用者报告的 Application 的 GUID 是 C3EC6BC0-D544-47D5-A0F2-2825E47DBE24 - 这是 SQL Server 2014 版本。但是,当您运行它时,它找不到它,因为实际的服务器只安装了 2012,即5572B772-88AC-4A35-96F8-E28626AC7E8F

您需要在本地实例上执行安装以设置 SQL Server 2012 SQL Server Integration Services Service(开发人员版很好),可能是 SQL Server Data Tools,但我不知道那。

这应该会为您提供您目前拥有的 2012 版 2014 版的所有 DLL。然后,您将完成使用所有 2014 程序集的 SQL Server 2012 版本的过程。

从许可的角度来看,请意识到在服务器本身上安装集成服务服务作为 SQL Server 的许可实例。每当您确认您的许可时,这可能是一个痛苦且昂贵的解释,说明为什么您拥有基于每核的许可产品只是为了运行 SSIS 包。使用 SQL Server 2012 中的项目部署模型,如果您在某处安装了实际数据库,您可能会查看通过存储过程调用调用包是否也可以满足您的需求,而无需额外支付单独服务器的许可费用。

【讨论】:

  • 你是对的。我阅读了另一篇文章,其中指出实际的 .net 库来自 SQL Server 安装程序,而不是 VS。果然,当我安装 SQL Server 2012 时,我可以选择 Microsoft.SqlServer.ManagedDTS 程序集的版本 11。有趣的是它现在只适用于任何 CPU / x64,所以我不知道为什么它是 BadImageFormatExceptioning。该问题现在已成为与包版本号有关的运行时错误,这似乎是您无法将 VS2013 数据工具与 SQL Server 2012 goo.gl/RH02Lg 一起使用
  • Backwards compatibility 不适用于 SQL Server 工具
  • 是的,我将旧的 dtsx 从源代码控制中取出,它可以工作。我目前不需要制作任何软件包,所以目前还可以,但如果需要进行更改,那就太蹩脚了。那时我们只需要考虑 SQL Server 升级。顺便说一句,也感谢关于许可的观点。事实证明,由于 .Net 包装器和我所做的更改,我们将保存 2 个许可证,但这一点很好。
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多