Sql server SSIS从2008R2升级到2017-连接到OLEDB数据源时脚本任务失败
我正在将数据仓库从SQL Server 2008R2升级到2017。升级后,每个脚本任务在尝试连接到日志数据库时都会抛出相同的错误 该任务通过OLEDB连接管理器连接到数据库,然后将一些元数据写入日志表。初始连接失败。我希望这是一个相当简单的调用错误,但我是一个SQL专家,不是VB专家,我没有看到这个问题 我发现了这个问题,但是脚本没有调用AcquireConnection()方法,所以我认为它不适用。如果是的话,我不知道怎么做 这是代码,通过故障点Sql server SSIS从2008R2升级到2017-连接到OLEDB数据源时脚本任务失败,sql-server,vb.net,ssis,sql-server-2017,ssis-2017,Sql Server,Vb.net,Ssis,Sql Server 2017,Ssis 2017,我正在将数据仓库从SQL Server 2008R2升级到2017。升级后,每个脚本任务在尝试连接到日志数据库时都会抛出相同的错误 该任务通过OLEDB连接管理器连接到数据库,然后将一些元数据写入日志表。初始连接失败。我希望这是一个相当简单的调用错误,但我是一个SQL专家,不是VB专家,我没有看到这个问题 我发现了这个问题,但是脚本没有调用AcquireConnection()方法,所以我认为它不适用。如果是的话,我不知道怎么做 这是代码,通过故障点 Imports System Imports
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)
System.InvalidCastException
HResult=0x80004002
Message=无法将类型为“System.\u 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(对象目标、对象[]参数、签名符号、布尔构造函数)
位于System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(对象obj,对象[]参数,对象[]参数)
在System.Reflection.RuntimeMethodInfo.Invoke(对象obj、BindingFlags invokeAttr、绑定器绑定器、对象[]参数、CultureInfo区域性)
位于System.RuntimeType.InvokeMember(字符串名称、BindingFlags BindingFlags、绑定器绑定器、对象目标、对象[]提供的参数、参数修改器[]修饰符、CultureInfo区域性、字符串[]namedParams)
位于Microsoft.SqlServer.Dts.Tasks.ScriptTask.vstatasksscriptingengine.ExecuteScript()处
更新。我找到了代码的源代码,这是马特·梅森的一篇博客文章。它仍然没有文档记录,可能在SQL 2008和2017之间的某个时间被破坏 此处记录了支持的方法: 在脚本任务中获取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创建新的OleDb连接(您还负责在脚本任务中关闭该连接)。像这样:
Dim cm2 As ConnectionManager = Dts.Connections("Configuration_Metadata_Logging_oledb")
Using conn2 As New OleDb.OleDbConnection(cm2.ConnectionString)
conn2.Open()
End Using
更新。我找到了代码的源代码,这是马特·梅森的一篇博客文章。它仍然没有文档记录,可能在SQL 2008和2017之间的某个时间被破坏 此处记录了支持的方法: 在脚本任务中获取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创建新的OleDb连接(您还负责在脚本任务中关闭该连接)。像这样:
Dim cm2 As ConnectionManager = Dts.Connections("Configuration_Metadata_Logging_oledb")
Using conn2 As New OleDb.OleDbConnection(cm2.ConnectionString)
conn2.Open()
End Using
查看您的OLEDB连接,确保它使用的是数据库所在的SQL Server版本的正确提供程序。可能它会自动将提供程序升级到比您更新的版本。@TabAlleman,OLEDB连接管理器正在使用SQLNCLI11.1。包的其他组件(执行SQL和数据流任务)能够成功连接,这也是我添加到问题中的。好主意,我以前没有验证过。查看您的OLEDB连接,确保它使用的是数据库所在的SQL Server版本的正确提供程序。可能它会自动将提供程序升级到比您更新的版本。@TabAlleman,OLEDB连接管理器正在使用SQLNCLI11.1。包的其他组件(执行SQL和数据流任务)能够成功连接,这也是我添加到问题中的。好主意,虽然我以前没有验证过。我不知道VB的boo,但连接管理器是另一回事。这绝对是OLEDB连接。不过,你提出了一个很好的观点。这些软件包已经在08R2上运行多年了,但我还没有同时完成当前代码和转换前代码。我想知道升级是否给我带来了一些我完全错过的东西。我现在是手机用户,但当我回到电脑前,我会看看这种可能性。我找到了这种模式的来源并更新了答案。谢谢你找到了那篇博文。有点像一把冒烟的枪。不方便的是,当这些连接在新服务器上运行时,它们仍然可以工作,但在我的本地机器上却不能。所以我仍然认为“正确”是很重要的,但是做这件事的紧迫性被抛到了窗外。不过,这仍然是一个可靠的答案。我对VB不太了解,但连接管理器是另一回事。这绝对是OLEDB连接。不过,你提出了一个很好的观点。这些软件包已经在08R2上运行多年了,但我还没有同时完成当前代码和转换前代码。我想知道升级是否给我带来了一些我完全错过的东西。我现在是手机用户,但当我回到电脑前,我会看看这种可能性。我找到了这种模式的来源并更新了答案。谢谢你找到了那篇博文。索尔