从 C# 错误执行 DTS 包无法转换类型为“Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass”的 COM 对象

Posted

技术标签:

【中文标题】从 C# 错误执行 DTS 包无法转换类型为“Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass”的 COM 对象【英文标题】:Executing DTS Package from C# error Unable to cast COM object of type 'Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass' 【发布时间】:2021-05-25 22:15:05 【问题描述】:

我正在开发一个控制台应用程序,我正在从 c# 执行一个 SSIS 包。

下面是我的执行代码

private bool ExecutePackage(int _sid, int _pid, int _envid, string _connection, int _scheduleId)
        
            bool isSuccess = false;

           try
            
                var dtPackagePath = HandlerFunctions.GetPackageInformation(_sid, _pid, _envid);
                var DtsxPath = dtPackagePath.Rows[0]["dtsx_path"].ToString();

                Application app = new Application();
                Package package = null;
                //Load the SSIS Package which will be executed
                package = app.LoadPackage(DtsxPath, null);
                //Pass the varibles into SSIS Package

                package.Variables["User::mEnvID"].Value = _envid;
                package.Variables["User::mPID"].Value = _projectid;
                package.Variables["User::mSID"].Value = _sponsorid;
                package.Variables["User::mConnectionString"].Value = _connection;
                
                var results = package.Execute();
                //Check the results for Failure and Success
                if (results == DTSExecResult.Failure)
                
                    var err = "";
                    foreach (var localDtsError in package.Errors)
                    
                        var error = localDtsError.Description;
                        err = err + error;
                    
                

                if (results == DTSExecResult.Success)
                
                    isSuccess = true;
                

            
            catch (Exception ex)
            
                isSuccess = false;
                HandlerFunctions.WriteExceptionLog(_scheduleId, _sponsorid,
                    _projectid,
                    "Execute DTSX", ex.Message, ex.InnerException != null ? ex.InnerException.ToString() : string.Empty,
                    ex.StackTrace,
                    Convert.ToDateTime(DateTime.Now));

                throw;
            
           return isSuccess;
        

我在这个项目中引用了 Microsoft.Sqlserver.managedDTS.dll 并在 using 属性中使用了以下内容

using Microsoft.SqlServer.Dts.Runtime;
using Application = Microsoft.SqlServer.Dts.Runtime.Application;

我也在系统中使用GACUTIL注册了ManagedDTS.dll。

但是,当我运行 porgram 时,我在 Application app = new Application(); 中遇到错误错误如下

Unable to cast COM object of type 'Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass' to interface type 'Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSApplication130'. This operation failed because the QueryInterface call on the COM component for the interface with IID '77A93073-6272-4FAC-BDB5-0C589385701C' failed due to the following error: Library not registered. (Exception from HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED)).

谁能帮我解决这个问题?

【问题讨论】:

Library not registered + I have also registered the ManagedDTS.dll using the GACUTIL 您是在尝试自己复制和安装这些库,还是将它们作为 SSIS 集成服务安装的一部分进行安装? @billinkc 我已将此 dll 复制到我的项目解决方案中并已注册。我也尝试使用 GAC 文件夹中的 dll,但都返回了相同的错误。 【参考方案1】:

问题有两个方面。第一个是您试图零碎地复制集成服务的 DLL,这不是安装程序处理它的方式。您需要重现 SQL Server 安装程序的所有相同操作,以使 SSIS 在客户端计算机上进入工作状态。

更大的问题是,您试图做的是违反许可协议。您有权免费开发 SSIS 包。除非该服务器已获得 SQL Server 许可,否则您无权运行 SSIS 包。即使您设法解决了第一个问题,您也已经创建了一个解决方案,使您的雇主或客户承担 Microsoft 许可的法律责任,而且这不会是一个廉价的解决方案。不是 Oracle 许可数量级差,但仍然不愉快。

要使开发人员计算机进入正确状态,您需要获取 SQL Server 开发人员版的副本。在实例功能屏幕上,选择 “集成服务”

这将确保所有正确的程序集都安装在他们希望找到的位置。

【讨论】:

这将被部署在一个企业平台中,其中所有产品都获得了正确的许可,包括 SQL Server。您认为它仍然存在许可问题吗? 许可问题是您的大客户经销商 (LAR) 和您的组织之间的问题。与您的 LAR 讨论您的用例。他们向您出售了您的许可证,作为交易的一部分,他们有责任成为合理使用许可证的顾问。我让客户解释了他们在做什么,LAR 可以提供“允许”、“不允许”、“有问题但可能会/不会在审核中被标记”的指导【参考方案2】:

根据错误,您运行此程序的机器似乎没有安装 SQL Server Integration Services。

您需要 SSIS 才能运行 SSIS 包! (You can't run SSIS packages without SSIS)

您不需要复制/注册 DLL,您应该尝试引用 SQL Server 安装程序安装的 C# 程序集。

见:https://docs.microsoft.com/en-us/sql/integration-services/integration-services-programming-overview?view=sql-server-ver15

在我的机器上,我可以在这个位置看到 C# 程序集:

【讨论】:

嗨,Subbu。 SSIS 安装在我的机器上。我有很多只在这台机器上设计和运行的包。但是,我无法在参考文献中找到 MangedDTS.DLL。

以上是关于从 C# 错误执行 DTS 包无法转换类型为“Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass”的 COM 对象的主要内容,如果未能解决你的问题,请参考以下文章

C#错误(无法将类型'string'隐式转换为'int')[重复]

SQL Server 2005 DTS导入平面数据源时(如txt文档),总是被截断,无法执行的错误解决方案

C#中怎么将string转换成int型

向启用文本框 (C#) 的 Web 部件添加按钮,出现错误:无法将类型“bool”隐式转换为“字符串”

无法在 C# 中将类型 'byte[]' 隐式转换为 'byte?[]'

C#代码显示错误无法将类型“string”转换为“int”