| Previous | Next |
| hrInvalidFilename | hrColumnInUse |
hrInvalidBookmark
Locate the failure in the Jet call chain
hrInvalidBookmark means a bookmark cannot be interpreted for the current table and index context.
This is the legacy Directory Service backup/restore HRESULT form of JET_errInvalidBookmark (0xC8000415).
The key comparison is: hrNoCurrentRecord concerns cursor position; this code says the supplied bookmark token itself is invalid here. The first useful observation is to record bookmark bytes and length, source table, database generation, current index, and cursor lifetime. 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 | a bookmark cannot be interpreted for the current table and index context |
| First corrective direction | treat bookmarks as opaque, table-scoped values and regenerate them after rebuild, restore, or schema change |
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: record bookmark bytes and length, source table, database generation, current index, and cursor lifetime.
- 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
0xC8000415, the Jet API name, and the current instance/session ownership. - Verify the code-specific precondition: record bookmark bytes and length, source table, database generation, current index, and cursor lifetime.
- Apply the targeted fix: treat bookmarks as opaque, table-scoped values and regenerate them after rebuild, restore, or schema change.
- Before retrying the operation, reconcile cursor currency, row existence, bookmark validity, and prepared-update cleanup.
Distinguishing signals
hrAlreadyPrepared | the cursor already has a prepared update/copy state and received another incompatible prepare request |
|---|---|
hrNoCurrentRecord | the cursor is before-first, after-last, on a deleted row, or otherwise not positioned on a record |
hrUpdateNotPrepared | JetSetColumn/JetUpdate-style work reached a cursor without a matching prepared update state |
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.
