在自定义SSIS数据流组件中使用OleDb连接管理器时的事务支持



我在谷歌上搜索了很多,并多次偶然发现一些文章,这些文章让我觉得——这行不通!

根据此链接https://learn.microsoft.com/en-us/sql/integration-services/extending-packages-scripting/data-flow-script-component/connecting-to-data-sources-in-the-script-component?view=sql-服务器-2014

在脚本组件中编写托管代码时,不能调用返回非托管的连接管理器的AcquireConnection方法对象,如OLE DB连接管理器和Excel连接管理器。但是,您可以读取ConnectionString属性,并连接到数据源通过使用OLEDB的连接字符串直接在代码中从系统连接。数据OleDb命名空间。

我相信,如果我不能调用Acquire Connection,那么我就不能参与组件容器在SSIS包中启动的事务。

我现有的SSIS包使用OLEDB连接管理器(本机(,我的自定义组件将使用相同的连接管理器。目前,我正在使用连接字符串而不调用Acquire connection-在这种方法中,由于我正在创建一个新连接,组件无法参与父SSIS序列容器可能已经启动的任何事务,这反过来又不会在下游发生故障时回滚自定义组件所做的更改。并将现有的连接管理器更改为ADO。NET看起来不可行,因为现有的OleDb连接管理器在许多OleDb组件中使用,如现有代码中的OleDbdestination。

有没有办法解决这个问题?所以基本上我想在自定义组件中使用OleDb连接管理器来处理事务?

嗯,DbConnection及其衍生物SqlConnection类具有方法EnlistTransaction,该方法允许将此连接添加(登记(到分布式事务。请注意,这是由MS DTC管理的分布式事务,而不是本机MS SQL事务
从理论上讲(我从未在这种特定的场景中这样做过(,您可以根据从OLE DB连接管理器派生的连接字符串打开托管连接,并将其登记到事务中。在开发过程中需要查找和检查的内容:

  • 安装、配置并确保MS DTC正常工作,并且可以由运行包的服务器和DB服务器访问
  • 如果包中没有分布式事务(当为TransactionSupport <> Required时(,事务参数将为null。您也应该在代码中处理这种情况
  • AquireConnection中的Transaction参数的类型为object,文档说它是分布式事务的句柄。我会在进入AquireConnection方法时做一个断点,并检查其真实结构;您需要将其强制转换为System.Transactions.Transaction类型
  • 您可以尝试通过调用System.Transactions.Transaction.Current来获得环境分布式事务。也许,它可能会起作用

请更新您的结果。

相关内容

最新更新