从 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#) 的 Web 部件添加按钮,出现错误:无法将类型“bool”隐式转换为“字符串”