BeginTransaction需要打开连接。连接的当前状态是Open,Executing

时间:2013-03-17 09:31:41

标签: c# .net db2

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

  

“BeginTransaction需要打开连接。连接是   当前状态为Open,执行“

异常。

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 - 但也有同样的行为。

3 个答案:

答案 0 :(得分:1)

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

您有几个选择:

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

2)打开2个连接。使用一个用于阅读,一个用于写入您的交易。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

所以不要打开阅读器并开始交易,而不是选择。我获取40行,关闭阅读器,执行我想要的事务,然后使用“ExecutePageReader”获取接下来的40行。