当我运行以下代码时,我得到了
“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 - 但也有同样的行为。
答案 0 :(得分:1)
这种情况正在发生,因为您尝试在连接具有打开的数据读取器时启动事务。
您有几个选择:
1)将您需要的所有数据读入内存,关闭阅读器,然后开始交易。
2)打开2个连接。使用一个用于阅读,一个用于写入您的交易。
答案 1 :(得分:0)
您可以使用更新意图执行选择,这将为每行创建IU(意图更新)锁定,并且您可以将其转换为IX(意图独占),并且在该状态下,您可以执行事务处理。如果使用SQLJ,这会更容易。
答案 2 :(得分:0)
经过大量调查后,我发现我应该使用“ExecutePageReader”,这是SQL中与ServerSideCursors等效的DB2。
所以不要打开阅读器并开始交易,而不是选择。我获取40行,关闭阅读器,执行我想要的事务,然后使用“ExecutePageReader”获取接下来的40行。