Как использовать транзакции в Informix CSDK и OIC ++ - PullRequest
1 голос
/ 23 февраля 2011

Мне нужен совет, как обрабатывать транзакции с помощью 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 голосов
/ 24 февраля 2011

хорошо, еще раз я отвечаю себе ...

из 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();
...