gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:24:56 25 4
gpt4 key购买 nike

我在谷歌上搜索了很多,并反复偶然发现了几篇让我觉得 - 这行不通的文章!
根据这个链接
https://docs.microsoft.com/en-us/sql/integration-services/extending-packages-scripting/data-flow-script-component/connecting-to-data-sources-in-the-script-component?view=sql-server-2014

When you write managed code in a Script component, you cannot call theAcquireConnection method of connection managers that return unmanagedobjects, such as the OLE DB connection manager and the Excelconnection manager. However, you can read the ConnectionStringproperty of these connection managers, and connect to the data sourcedirectly in your code by using the connection string of an OLEDBconnection from the System.Data.OleDb namespace.


而且我相信,如果我不能调用 Acquire Connection,那么我就不能参与 SSIS 包中组件容器已经启动的事务。
我现有的 SSIS 包使用 OLEDB 连接管理器( native ),我的自定义组件将使用相同的连接管理器。目前,我正在使用连接字符串而不调用 Acquire Connection - 在这种方法中,由于我正在创建一个新连接,因此该组件无法参与父 SSIS 序列容器可能已启动的任何事务,而后者又不会如果下游发生故障,则导致自定义组件所做的更改回滚。将现有的连接管理器更改为 ADO.NET 看起来并不可行,因为影响巨大,因为现有的 OleDb 连接管理器用于许多 OleDb 组件(如现有代码中的 OleDb 目标)。
有什么办法可以解决这个问题——所以基本上我想在自定义组件中使用 OleDb 连接管理器让事务工作?

最佳答案

那么,数据库连接 及其衍生物, SqlConnection 类有方法 EnlistTransaction ,它允许将此连接添加(登记)到分布式事务中。请注意这是一个 分布式事务由 MS DTC 管理,而不是 native MS SQL 事务。
理论上(我从未在这种特定情况下这样做过),您可以根据从 OLE DB 连接管理器派生的连接字符串打开托管连接,并将其登记到事务中。在开发中寻找和检查的事情:

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

  • 请更新您的结果。

    关于sql-server - 在自定义 SSIS 数据流组件中使用 OleDb 连接管理器时的事务支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63030050/

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