0

当我运行以下代码时,我得到

“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 - 但得到了相同的行为。

4

3 回答 3

1

发生这种情况是因为您尝试在连接具有打开的数据读取器时启动事务。

你有几个选择:

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

2)打开2个连接。使用一个用于读取和一个用于写入您的事务。

于 2013-03-17T09:39:50.820 回答
0

您可以使用更新意图进行选择,这将为每一行创建一个 IU(意图更新)锁,并且您可以将其转换为 IX(意图独占),并且在该状态下您可以进行事务。如果您使用 SQLJ,那就更容易了。

于 2013-03-17T14:50:21.960 回答
0

经过大量调查后,我发现我应该使用“ExecutePageReader”,它是 SQL 中 ServerSideCursors 的 DB2 等价物。

因此,不要在选择时打开阅读器并开始交易。我获取 40 行,关闭阅读器,对事务做任何我想做的事情,然后使用“ExecutePageReader”来获取接下来的 40 行。

于 2014-03-05T12:41:40.750 回答