代码之家  ›  专栏  ›  技术社区  ›  Eric Brandt

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

  •  1
  • Eric Brandt  · 技术社区  · 7 年前

    我正在将数据仓库从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.\u coobject”类型的COM对象转换为接口类型“Microsoft.SqlServer.Dts.Runtime.Wrapper.idtsconnectionmanagerdatabaseparameters 100”。此操作失败,因为对IID为{624862CB-55F9-4A92-965F-62BC4935296A}的接口的COM组件的QueryInterface调用失败,原因是出现以下错误:不支持此类接口(HRESULT的异常:0x80004002(E_No interface))。

    如果还有什么我可以补充的问题,请让我知道。

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

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

    调用的目标引发了异常。

    at System.RuntimeMethodHandle.InvokeMethod(对象目标,对象[]参数,签名sig,布尔构造函数) 在System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object[]参数,Object[]参数) 在System.Reflection.RuntimeMethodInfo.Invoke(对象obj、绑定标志invokeAttr、绑定绑定器、对象[]参数、文化信息区域性) 位于System.RuntimeType.InvokeMember(字符串名称、BindingFlags BindingFlags、绑定绑定器、对象目标、对象[]providedArgs、参数修改器[]修饰符、文化信息区域性、字符串[]namedParams) 在Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

    1 回复  |  直到 7 年前
        1
  •  4
  •   David Browne - Microsoft    7 年前

    更新。我找到了代码的来源,这是马特·梅森的博客 Accessing OLEDB Connection Managers in a Script . 它仍然没有文档记录,可能在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连接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