gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:59:41 25 4
gpt4 key购买 nike

我正在将数据仓库从 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=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 的一篇博客文章,名为 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

关于sql-server - SSIS 从 2008R2 升级到 2017 - 连接到 OLEDB 数据源时脚本任务失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51679430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com