BeginTransaction需要一个打开的连接.连接的当前状态为“打开,正在执行”

本文关键字:连接 打开 状态 执行 一个 BeginTransaction | 更新日期: 2023-09-27 18:04:12

当我运行下面的代码时,我得到

"BeginTransaction需要打开连接。连接的当前状态为"打开,正在执行"

例外。

using (var con = new IBM.Data.DB2.DB2Connection(
                         "Server=localhost;Database=SAMPLE;UID=***;PWD=***;"))
{
    con.Open();
    var c = con.CreateCommand();
    c.CommandText = "select * from DB2TEST";
    using (var r = c.ExecuteReader())
    {
        r.Read();
        con.BeginTransaction();// The exception is thrown here!!!
    }
}

我知道如果我将Begin事务移动到代码中的较早时间,它将工作-但这并没有削减它。我需要迭代一个非常大的读取器,并根据需要打开和关闭事务。

我尝试ExecuteResultSet -但得到相同的行为

BeginTransaction需要一个打开的连接.连接的当前状态为“打开,正在执行”

这是因为您正在尝试在连接有开放数据读取器的情况下启动事务。

你有几个选择:

1)将所有需要的数据读入内存,关闭读卡器,然后开始事务。

2)打开2个连接。一个用于读取,一个用于写入事务。

你可以用update intent做一个select,这将为每一行创建一个IU (intent update)锁,然后你可以将它转换为IX (intent exclusive),在那个状态下你可以做你的事务。如果使用SQLJ,这将更容易。

经过大量调查,我发现我应该使用"ExecutePageReader",它是SQL中的serversidecurors的DB2等效。

所以,而不是打开阅读器并开始交易,而它的选项。我获取40行,关闭阅读器,做任何我想要的事务,然后使用"ExecutePageReader"获取接下来的40行。