Releases for RepoDb.Firebird.BulkOperations
View the NuGet package here or download it directly here.
RepoDb.Firebird.BulkOperations (v1.0.0)
Released: September 8, 2026
First general availability (non-preview) release of the Firebird Bulk Operations package, promoting the preview below to stable v1.0.0. No functional changes since the preview — see that entry for the full feature set and known limitations.
RepoDb.Firebird.BulkOperations (v0.0.1-alpha) - Preview
Released: 2026-08-29
New
First release of the bulk operations extension for RepoDb.Firebird, built on FbBatchCommand — the FirebirdSql.Data.FirebirdClient driver’s native ADO.NET batching API — via FirebirdCommandBatcher.
Verification status: this package has been implemented and reviewed, but not yet exercised against a live Firebird instance. Verify the pseudo-table lifecycle, the
EXECUTE BLOCKidentity read-back paths, and the transactional behavior end-to-end before relying on this package in production.
What’s included
- BulkInsert, BulkMerge, BulkUpdate, BulkDelete and BulkDeleteByKey, each with an
Asyncoverload, callable against anFbConnectionwith an entity list, aDataTable, or anIDataReader(BulkDeleteByKeytakes a list of primary key values instead). - FirebirdCommandBatcher — an
FbBatchCommand-based bulk-copy class with true asynchronous capability (FbBatchCommand.ExecuteNonQueryAsync), used internally to write into the target table (BulkInsertwithoutReturnIdentity) and into the pseudo (staging) table backing the other operations. FirebirdBulkImportIdentityBehavior(KeepIdentitydefault,ReturnIdentity) — controls whether identity values are sent as-is or read back.ReturnIdentityreads generated values back via anEXECUTE BLOCKcursor loop over the staging table, correlated to the source rows by a client-assigned row-order column rather than by sorting the generated identities themselves.FirebirdBulkImportPseudoTableType(Auto,Memory,Physical) — selects the staging-table strategy backingBulkMerge,BulkUpdate,BulkDelete,BulkDeleteByKey, andBulkInsert(whenReturnIdentityis used). Every staging table is created with a per-call unique name, soMemoryandPhysicalare both genuinely functional and safe under concurrent callers writing against the same target table.- FirebirdCommandBatcherMapItem — explicit source-to-destination column mapping, with an optional
FbDbTypeoverride. - FirebirdCommandBatcherColumnMappingCollection — the
ColumnMappingscollection backingFirebirdCommandBatcher. - FirebirdTraceKeys — the tracing key constants for the five bulk operations, for use with ITrace.
BulkMergegenerates one of three statement shapes depending on whether the identity column is itself a qualifier and whetherReturnIdentityis requested: a single ANSIMERGE, anEXECUTE BLOCKloop ofUPDATE OR INSERT ... RETURNING, or anEXECUTE BLOCKloop that branches per row between a plainINSERTandUPDATE OR INSERT— see BulkMerge for details.- When a caller-supplied
FbTransactionis passed, every step of a bulk operation’s pipeline (pseudo-table DDL, the batched write, the cascading statement, and the pseudo-table drop) participates in it — and since Firebird’s DDL is itself transactional, the whole pipeline is genuinely atomic in that case.
Known limitations (v1)
- Without an explicit caller-supplied
transaction, each step of a bulk operation’s pipeline runs under its own implicit transaction, so a failure partway through (e.g. after the pseudo table is created but before it is dropped) can leave an orphaned pseudo table behind. BulkCopyTimeoutis accepted on every operation, butFbBatchCommandhas no timeout-equivalent property to apply it to — the argument currently has no effect.BulkMerge/BulkUpdate/BulkDelete/BulkDeleteByKeyreport Firebird’s engine-level affected-row count where available, butMERGE/EXECUTE BLOCKstatements always report-1fromExecuteNonQuery— for those, the pseudo table’s own row count is used as a proxy instead, on the assumption that every staged row is guaranteed to be either inserted, updated, or matched for deletion.- The
DbDataReaderoverloads ofBulkInsertandBulkMergehave noidentityBehaviorargument — a forward-only, single-pass reader cannot be rewound to correlate generated identity values back onto a source row. BulkUpdatereturns0immediately, without creating a pseudo table at all, when every staged field is also a qualifier (i.e. there is nothing left to actually update).- Every bulk call against a table it hasn’t seen before creates its own uniquely-named staging table (
CREATE TABLE/CREATE GLOBAL TEMPORARY TABLE) and drops it once the call completes, rather than reusing one across calls — trading a small amount of per-call DDL overhead for full safety under concurrent callers. This package inherits every Known limitation of RepoDb.Firebird itself (e.g. no table hints,
MaxParameterCountof1500, Firebird 3.0+ required for identity detection).- Referenced the
RepoDbpackagev1.16.0. - Referenced the
RepoDb.Firebirdpackagev0.0.1-alpha. - Referenced the
FirebirdSql.Data.FirebirdClientpackagev10.3.4.