MFC CRecordset: Невозможно сбросить вновь добавленный набор записей в источник данных и продолжить его обновление - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю над рефакторингом некоторого кода обработки данных в приложении MFC, которое использует API CRecordset (фактически, производный от него класс, но сбои исходят из самого AFAICT CRecordset), чтобы общаться с источником данных ODBC, поддерживаемым базой данных Oracle, но столкнулись с последовательностью операций, которые API-интерфейс CRecordset, по крайней мере с версией, поставляемой с Visual Studio 2012 (которая, как я знаю, устарела, но на данный момент привязана), кажется, не может выполнять.

В частности, в следующей последовательности событий, предназначенной для сброса изменений в записи в БД, чтобы их могли видеть другие запросы, выполненные во время этой последовательности:

CRecordset aRecordset(myDatabase);
aRecordset.Open(CRecordset::snapshot, "<some query that yields no records>"); // using CRecordset::dynaset doesn't change things
aRecordset.AddNew();
// set some values on aRecordset...
aRecordset.Update();
aRecordset.Requery();   // removing the Requery calls changes the failure mode
aRecordset.Edit();   // This call fails if the Requery is present
// perform query that needs to pick up on the values set on aRecordset above
// set some more values on aRecordset...
aRecordset.Update();    // This call fails if the Requery is not present
aRecordset.Requery();
aRecordset.Edit();
// perform query that needs to pick up on the values set on aRecordset above
// set yet more values on aRecordset...
aRecordset.Update();
aRecordset.Close();

Я получаю два разных режима отказа в зависимости от того, присутствуют вызовы Requery или нет.

При наличии вызовов Requery я получаю следующую ошибку при первом вызове Edit в последовательности:

Error: Edit attempt failed - not on a record.
Operation failed, no current record.

пока они отсутствуют, я получаю другую ошибку, на этот раз от второго вызова Update в последовательности, как показано ниже:

Error: failure updating record.
Invalid cursor state
State:24000,Native:0,Origin:[Microsoft][ODBC Driver Manager]

Полностью ли я расстроен, ожидая, что CRecordset сможет сбросить вновь добавленную запись в базу данных, а затем вернуться к дальнейшему обновлению строки? Или это простой случай ошибки оператора API, и если да, то что мне здесь не хватает? Моя Visual Studio / MFC слишком стара для этой необычной работы?

Кроме того, оказывается, что выполнение .Requery () не является опцией из-за требования, что я могу .Open () набор записей с несколькими строками, а затем выполнить .Edit () /. Update () /.Edit () /. Update () последовательность в каждой строке. Использование .Requery () в этом случае приводит к тому, что курсор сбрасывается в начало без хорошего способа восстановить положение курсора, поскольку драйверы Oracle ODBC не поддерживают создание закладок для запроса.

...