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

时间:2018-08-03 20:04:15

标签: sql-server vb.net ssis sql-server-2017 ssis-2017

我正在将数据仓库从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     Message =无法将类型为“ 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和数据流任务”)都可以成功连接。

编辑II:为了使其更易于搜索,这是在向脚本任务添加断点并逐步执行该任务之前,程序包会引发的初始错误。

  

调用的目标已引发异常。

     在System.RuntimeMethodHandle.InvokeMethod中的

(对象目标,对象[]参数,签名sig,布尔值构造函数)      在System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object []参数,Object []参数)      在System.Reflection.RuntimeMethodInfo.Invoke处(对象obj,BindingFlags invokeAttr,活页夹活页夹,Object []参数,CultureInfo文化)      在System.RuntimeType.InvokeMember处(字符串名称,BindingFlags bindingFlags,活页夹绑定程序,对象目标,Object []提供的Args,ParameterModifier []修饰符,CultureInfo文化,String [] namedParams)      在Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

1 个答案:

答案 0 :(得分:4)

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

此处记录了受支持的方法:Connecting to Data Sources in the Script Task

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

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

 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