我正在将数据仓库从 SQL Server 2008R2 升级到 2017。升级后,每个脚本任务都在尝试连接到日志数据库时抛出相同的错误。
该任务通过 OLEDB 连接管理器连接到数据库,然后将一些元数据写入日志表。建立初始连接失败。我希望这是一个相当简单的调用错误,但我是一个 SQL 人,而不是 VB 人,我没有看到这个问题。
我发现了这个问题Missing library to reference OLEDB connection types,但是脚本没有调用 AcquireConnection() 方法,所以我认为它不适用。或者,如果是,我不知道如何。
这是通过故障点的代码。
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Data.OleDb
Imports System.Collections
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
Enum ScriptResults
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
End Enum
Public Sub Main()
Dim fireAgain As Boolean
Dim pkgExecVar As Variables
Dim cm As ConnectionManager
Dim cmParam As IDTSConnectionManagerDatabaseParameters100
Dim conn As OleDb.OleDbConnection
Dim cmd As OleDbCommand = New OleDbCommand()
pkgExecVar = Nothing
cm = Dts.Connections("Configuration_Metadata_Logging")
cmParam = CType(cm.InnerObject, IDTSConnectionManagerDatabaseParameters100)
conn = CType(cmParam.GetConnectionForSchema(), OleDb.OleDbConnection)
当我单步执行代码时,底部的第二行会引发异常。
cmParam = CType(cm.InnerObject, IDTSConnectionManagerDatabaseParameters100)
System.InvalidCastException HResult=0x80004002 消息=无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100”。此操作失败,因为 IID 为“{624862CB-55F9-4A92-965F-62BC4935296A}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .
如果还有什么我可以添加到问题中来帮助的,请告诉我。
编辑:OLEDB 连接管理器正在使用 SQLNCLI11.1。包的其他组件(执行 SQL 和数据流任务)能够成功连接。
编辑二:为了使这更易于搜索,这是包抛出的初始错误,在向脚本任务添加断点并单步执行之前。
调用的目标已引发异常。
在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) 在 System.Reflection.RuntimeMethodInfo。在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、BindingFlags、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化中调用(Object obj、BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化) , String[] namedParams) 在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()