如何在Informix CSDK和OIC ++中使用事务

时间:2011-02-23 18:43:39

标签: c++ transactions informix

我需要一些如何使用Informix CSDK和OIC ++处理事务的建议。

conn是一个开放的连接对象。选择作品查找。这里的数据库是使用日志记录设置的 - 正如我发现的那样,更新stmt本身什么都不做。

这是我试过的:

        conn.SetTransaction( ITConnection::BEGIN );
        qtext = "UPDATE transit_kunde_s SET erledigt='Y' WHERE transitkunde='"+ts+"'";
        cout << qtext << endl;

        code = query_up.ExecForStatus(qtext.c_str());
        cout << "code " << code << endl;
        conn.SetTransaction( ITConnection::COMMIT );

1 个答案:

答案 0 :(得分:0)

好的,我再次回答自己......

来自Informix C++ DocNotes

现在可以对提取的行中的大对象执行操作,即使连接仍被检出(锁定)。在ITQuery :: ExecForIteration()方法返回结果集中的多行后,将检出连接。它将保持签出状态,直到结果集中的最后一行已使用ITQuery :: NextRow()获取,或者通过调用ITQuery :: Finish()终止了查询处理。检查连接时,不能在该连接上执行其他查询。

因为我在一个查询结果迭代的while循环中,我需要另一个更新查询新连接

// already have 2 connection objects: conn, conn2

ITQuery query(conn);
ITQuery query_up(conn2);

string qtext;
qtext = "SELECT * FROM transit_kunde_s WHERE erledigt='N' ORDER BY transitkunde";
okay = query.ExecForIteration(qtext.c_str());

while (row = query.NextRow()) {
  // do stuff

  // NOW WANT TO DO ANOTHER QUERY? --> NEED ANOTHER CONNECTION!!
  ok_ta = conn2.SetTransaction( ITConnection::BEGIN);
  qtext = "UPDATE transit_kunde_s SET erledigt='Y' WHERE transitkunde='"+ts+"'";
  code = query_up.ExecForStatus(qtext.c_str());
  ok_ta = conn2.SetTransaction( ITConnection::COMMIT );

 }

// we see later the 1st query to be finished here
query.Finish();