MFC CRecordset:无法将新添加的记录集刷新到数据源,然后继续对其进行更新

时间:2018-11-16 15:26:19

标签: c++ visual-c++ mfc odbc

我正在使用MFC应用程序中重构一些数据处理代码,该应用程序使用CRecordset API(实际上是从其派生的类,但失败来自CRecordset本身AFAICT),以便与支持的ODBC数据源进行对话甲骨文数据库,但是遇到了CRecordset API的一系列操作,至少从Visual Studio 2012附带的版本开始(我知道它是旧的,但暂时还被保留)似乎无法执行表演。

特别是,在以下事件序列中,旨在将记录的更改刷新到DB,以便在此序列期间执行的其他查询可以看到它们:

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对于这种花哨的步伐是否太旧了?

此外,由于需要能够对多个行的记录集进行.Open(),然后执行.Edit()/。Update(),因此,执行.Requery()并不是一种选择。 /.Edit()/。Update()在每一行上的顺序。在这种情况下,使用.Requery()会导致将游标重置为开头,而没有恢复游标位置的好方法,因为Oracle ODBC驱动程序不支持在重新查询中添加书签。

0 个答案:

没有答案