| Previous | Next |
| DB_E_NOTFOUND | DB_E_NEWLYINSERTED |
DB_E_CANNOTFREE
Provider has ownership of this tree
Exact value and interpretation
DB_E_CANNOTFREE has the unsigned 32-bit value 2147749402 (0x80040E1A) and the signed representation -2147217894. AllStat defines the result as “Provider has ownership of this tree”. In the concrete failure represented here, a consumer attempts to free or take ownership of a command tree that remains owned by the OLE DB provider.
The high bit is set for DB_E_CANNOTFREE, so it is a failure HRESULT rather than a success or informational status. Its facility field is 4 (FACILITY_ITF) and its low code is 3610 (0x0E1A). Those bit fields place DB_E_CANNOTFREE in an interface-defined family, but they do not reveal the provider, object identity, method, rowset generation or command state that produced it.
OLE DB contract boundary
DB_E_CANNOTFREE must be interpreted against this contract: an OLE DB command moves through explicit states: command definition, properties and parameters are established before optional preparation and execution; dialect, query-tree and optimizer contracts are provider-specific and should be inferred only from reported capabilities.
Start with the active command object, its state transition history, dialect and provider error records when investigating DB_E_CANNOTFREE. Preserve DB_E_CANNOTFREE before ADO, ATL, .NET, a database abstraction layer or an application exception replaces it with a generic message; the exact interface and method matter because one OLE DB object can expose several contracts with different preconditions.
Evidence to collect before changing the system
A useful DB_E_CANNOTFREE record includes provider CLSID and version, process architecture, interface and method, COM apartment and thread, object correlation ID, transaction state, and the first preceding HRESULT. When DB_E_CANNOTFREE involves command text, parameter values, object names and query-plan details, record types, lengths, hashes or redacted identifiers instead of secrets or full business data.
- Evidence 1 for
DB_E_CANNOTFREE: the method that returned the tree and its documented ownership contract. - Evidence 2 for
DB_E_CANNOTFREE: the allocator, node addresses and ownership flags. - Evidence 3 for
DB_E_CANNOTFREE: the command object's lifetime and any provider callback retaining the tree.
Specific conditions that produce this result
- Cause 1 for
DB_E_CANNOTFREE: the tree was returned under provider ownership rules. - Cause 2 for
DB_E_CANNOTFREE: a clone or translation call did not transfer ownership as the consumer expected. - Cause 3 for
DB_E_CANNOTFREE: the consumer mixes allocator or release conventions from a different command-tree API.
Diagnostic sequence
- Capture
DB_E_CANNOTFREEimmediately at the native OLE DB return and obtain the current OLE DB error object before another COM call replaces thread error information. - Identify the exact stage for
DB_E_CANNOTFREE: a consumer attempts to free or take ownership of a command tree that remains owned by the OLE DB provider. - For
DB_E_CANNOTFREE, compare the live command, rowset, accessor or schema state with the metadata and properties actually granted by the provider. - For
DB_E_CANNOTFREE, inspect per-binding, per-property, per-row or per-record statuses whenever the method supplies them; the aggregate result may not identify the rejected element. - For
DB_E_CANNOTFREE, reproduce the issue with the smallest command, rowset or definition operation that preserves the same contract boundary. - For
DB_E_CANNOTFREE, apply one evidence-backed correction, then verify that the operation succeeds and does not merely change into a nearby HRESULT.
Retry and recovery policy
Retry rule for DB_E_CANNOTFREE: retry is not appropriate until ownership is corrected; repeated freeing risks memory corruption even if the first call merely returns DB_E_CANNOTFREE. A safe DB_E_CANNOTFREE retry must use a changed input, object generation, provider capability or state transition. If the call returning DB_E_CANNOTFREE could have created, updated, deleted or copied data, determine partial completion before replaying it.
For DB_E_CANNOTFREE, use bounded retries and preserve cancellation. For DB_E_CANNOTFREE, configuration and contract failures should normally fail fast; concurrency, resource or transient state failures may justify retry only after their stated precondition changes.
Corrective actions
- Action 1 for
DB_E_CANNOTFREE: leave provider-owned trees untouched and use the documented release path. - Action 2 for
DB_E_CANNOTFREE: clone data into consumer-owned storage when modification or independent lifetime is required. - Action 3 for
DB_E_CANNOTFREE: centralize command-tree ownership in one wrapper to prevent double-free attempts.
Practical incident
A query inspector calls a generic tree destructor on a provider-owned tree obtained for diagnostics; switching to a read-only view prevents DB_E_CANNOTFREE. The diagnostic value comes from retaining DB_E_CANNOTFREE together with the failing interface and object state, not from reducing every provider result to “database error”.
Implementation guidance
Code handling DB_E_CANNOTFREE should release OLE DB resources in ownership order, preserve every provider error record, and log granted properties rather than only requested properties. When handling DB_E_CANNOTFREE, handles such as HACCESSOR, HROW, HCHAPTER and provider-specific region tokens must never be treated as portable integers across object lifetimes.
When DB_E_CANNOTFREE crosses an abstraction boundary, attach a stable correlation ID and structured fields for the native HRESULT, provider source, interface IID, method, object generation and operation phase. For DB_E_CANNOTFREE, do not log passwords, access tokens, complete SQL text or unrestricted row values merely to make the event easier to search.
Difference from related HRESULT values
DB_E_CANTTRANSLATE concerns representing a tree as text, while DB_E_CANNOTFREE concerns who owns and may release the tree. Keep these outcomes separate in telemetry and user-facing remediation because DB_E_CANNOTFREE requires a different next action.
Official Microsoft references
- Microsoft: OLE DB commands — official documentation relevant to
DB_E_CANNOTFREE. - Microsoft: ICommand — official documentation relevant to
DB_E_CANNOTFREE. - Microsoft: OLE DB command states — official documentation relevant to
DB_E_CANNOTFREE.
Looking for a different code? Search another status or error code.