2013-03-17 287 views
0

当我运行下面的代码我得到的BeginTransaction需要打开连接。连接的当前状态为打开,执行

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

+1

显然你需要在ExecuteReader之前开始事务。你是什​​么意思“按我想要的开放和关闭交易”。 – Phil 2013-03-17 09:36:42

+0

我需要在阅读时打开一个事务。 Oracle支持这一点。 使用SQL服务器我使用服务器端游标 – Noam 2013-03-17 10:51:03

+0

甚至无法在未打开的数据读取器上进行事务更新。需要单独的更新命令。需要注意的是DataReader会抓取多行以获得速度,因此如果更新下一行,您可能会从DataReader中获取陈旧的数据。我在这种情况下使用服务器游标,因为它不会遭受陈旧的数据。 – Paparazzi 2013-03-17 17:02:00

回答

0

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

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

1

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

你有两个选择:

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

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

0

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

相关问题