| Previous | Next |
| hrTooManyKeys | hrReadVerifyFailure |
hrRecordDeleted
Locate the failure in the Jet call chain
hrRecordDeleted means the cursor refers to a row that was deleted after it became the current record.
This is the legacy Directory Service backup/restore HRESULT form of JET_errRecordDeleted (0xC80003F9).
The key comparison is: hrRecordNotFound is a failed key lookup; this result describes a row that existed in the cursor lifecycle. The first useful observation is to capture transaction boundaries, cursor position, bookmark, and the session that performed the delete. 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 refers to a row that was deleted after it became the current record |
| First corrective direction | reseek from a stable key or bookmark and make deletion an expected concurrency outcome |
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
- 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; associate it with this result rather than with a later generic exception.
- bookmark bytes and the table/database context that produced them.
Response and verification
- Freeze the failing request context and record
0xC80003F9, the Jet API name, and the current instance/session ownership. - Apply the targeted fix: reseek from a stable key or bookmark and make deletion an expected concurrency outcome.
- Before retrying the operation, reconcile cursor currency, row existence, bookmark validity, and prepared-update cleanup.
Distinguishing signals
hrRecordClusteredChanged | an update attempted to change a clustered key in a way the engine cannot apply in place |
|---|---|
hrRecordNotFound | a seek or lookup found no row matching the constructed key or bookmark criteria |
hrNoCurrentRecord | the cursor is before-first, after-last, on a deleted row, or otherwise not positioned on a record |
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.