SSIS 从 2008R2 升级到 2017 - 连接到 OLEDB 数据源时脚本任务失败

SSIS upgrade from 2008R2 to 2017 - script task fails when connecting to OLEDB data source

我正在将数据仓库从 SQL Server 2008R2 升级到 2017。升级后,每个脚本任务都在尝试连接到日志记录数据库时抛出相同的错误。

该任务通过 OLEDB 连接管理器连接到数据库,然后将一些元数据写入日志记录 table。建立初始连接失败。我希望这是一个相当简单的调用错误,但我是 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 Message=Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{624862CB-55F9-4A92-965F-62BC4935296A}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

如果我还有什么可以添加到问题中以提供帮助,请告诉我。

编辑:OLEDB 连接管理器正在使用 SQLNCLI11.1。包的其他组件(执行 SQL 和数据流任务)能够成功连接。

编辑 II:为了使其更易于搜索,这是包抛出的初始错误,然后向脚本任务添加断点并单步执行它。

Exception has been thrown by the target of an invocation.

at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

更新。我找到了该代码的来源,它是 Matt Mason 的博客 post,名为 Accessing OLEDB Connection Managers in a Script。它仍然没有记录,可能在 SQL 2008 年和 2017 年之间的某个时间被破坏了。

此处记录了支持的执行此操作的方法:Connecting to Data Sources in the Script Task

在脚本任务中获得 System.Data.OleDbConnection 的唯一方法是

1) 使用 ADO.NET 连接管理器并将其配置为使用 ADO.NET OleDb 提供程序,如下所示:

 Dim cm As ConnectionManager = Dts.Connections("Configuration_Metadata_Logging_adonet_oledb")
 Dim conn As OleDb.OleDbConnection = CType(cm.AcquireConnection(Nothing), OleDb.OleDbConnection)

2) 使用 OleDb Connection Mamanger 并使用其 ConnectionString 创建一个新的 OleDbConnection(您还负责在脚本任务中关闭它)。像这样:

Dim cm2 As ConnectionManager = Dts.Connections("Configuration_Metadata_Logging_oledb")
Using conn2 As New OleDb.OleDbConnection(cm2.ConnectionString)
    conn2.Open()

End Using