| Previous | Next |
| hrKeyDuplicate | hrKeyNotMade |
hrAlreadyPrepared
Locate the failure in the Jet call chain
hrAlreadyPrepared means the cursor already has a prepared update/copy state and received another incompatible prepare request.
This is the legacy Directory Service backup/restore HRESULT form of JET_errAlreadyPrepared (0xC8000647).
The key comparison is: hrUpdateNotPrepared means no prepare state exists; this code means one is still active. The first useful observation is to trace JetPrepareUpdate mode, cursor ownership, prior cancel/update, and exception paths. This evidence distinguishes failed lookup, lost cursor currency, deleted rows, invalid bookmarks, and prepared-update state.
The ESE objects in play
| Diagnostic layer | cursor currency, bookmarks, prepared updates, and row lifecycle |
|---|---|
| Typical API surface | JetMove, JetSeek, JetGetBookmark, JetGotoBookmark, JetPrepareUpdate, JetUpdate, and JetDelete |
| Code-specific condition | the cursor already has a prepared update/copy state and received another incompatible prepare request |
| First corrective direction | complete or cancel the current prepared update before beginning another |
Preparing an update creates cursor state that must be completed or cancelled deliberately. Cursor currency can be invalidated by navigation, deletion, rollback, or concurrent changes.
Questions the logs must answer
- Code-specific observation: trace JetPrepareUpdate mode, cursor ownership, prior cancel/update, and exception paths.
- bookmark bytes and the table/database context that produced them; associate it with this result rather than with a later generic exception.
- prepared-update mode, row version, transaction, and concurrent writer; associate it with this result rather than with a later generic exception.
- the current index, seek relation, key, range, and preceding navigation result.
Response and verification
- Freeze the failing request context and record
0xC8000647, the Jet API name, and the current instance/session ownership. - Verify the code-specific precondition: trace JetPrepareUpdate mode, cursor ownership, prior cancel/update, and exception paths.
- Apply the targeted fix: complete or cancel the current prepared update before beginning another.
- Before retrying the operation, reconcile cursor currency, row existence, bookmark validity, and prepared-update cleanup.
Distinguishing signals
hrUpdateNotPrepared | JetSetColumn/JetUpdate-style work reached a cursor without a matching prepared update state |
|---|---|
hrInvalidBookmark | a bookmark cannot be interpreted for the current table and index context |
hrRecordNotFound | a seek or lookup found no row matching the constructed key or bookmark criteria |
Actions that can hide or worsen the problem
- Do not reuse bookmarks after restore, rebuild, or incompatible schema change.
- Do not retry a write without rereading the row and its business preconditions.
Technical references
Looking for a different code? Search another status or error code.