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 -但得到相同的行为
这是因为您正在尝试在连接有开放数据读取器的情况下启动事务。
你有几个选择:
1)将所有需要的数据读入内存,关闭读卡器,然后开始事务。
2)打开2个连接。一个用于读取,一个用于写入事务。
你可以用update intent做一个select,这将为每一行创建一个IU (intent update)锁,然后你可以将它转换为IX (intent exclusive),在那个状态下你可以做你的事务。如果使用SQLJ,这将更容易。
经过大量调查,我发现我应该使用"ExecutePageReader",它是SQL中的serversidecurors的DB2等效。
所以,而不是打开阅读器并开始交易,而它的选项。我获取40行,关闭阅读器,做任何我想要的事务,然后使用"ExecutePageReader"获取接下来的40行。