From magazine topic to project implementation
Relevant service and technical pages for this post
Those who want to modernize Paradox databases rarely face a pure technology problem. In many companies Paradox is part of an evolved process landscape: desktop clients, file-based tables, often coupled with the Borland Database Engine (BDE), plus workarounds for locking, network shares and historically “grown” datasets. As long as everything works, the setup is tolerated. It becomes critical when operations and security impose higher requirements, new interfaces are needed or Windows and network updates suddenly affect file access and locking.
This article classifies typical starting situations and shows modernization paths that respect ongoing operations. The focus is not on frameworks or source-code details, but on impacts to administration, data, interfaces, maintenance, security and migration risks. The goal is an approach you as IT management or the technical project lead can plan, steer and represent to the business units.
Why Paradox setups are failing in operation today
Paradox, as a file-based database technology (tables as files), is not “broken” in many environments, but it increasingly mismatches today’s operational realities. Data often resides on fileshares, accesses run via desktop clients and the BDE or other driver layers. This collides with modern requirements for availability, auditability and controlled changes.
Typical drivers for modernization are:
- Stability in network operation: File-based locking mechanisms are sensitive to latency, offline periods, aggressive antivirus scanners or unstable Wi‑Fi segments. This does not necessarily show as a “crash”, but as sporadic write conflicts, locked records or corrupted indexes.
- Security and compliance: Access via fileshares and local installations complicates centralized access control. Auditability, traceable changes and consistent permissions are harder to enforce in filesystem logic than in a server database.
- Interfaces and integration: Once DMS/ERP/CRM connections, REST APIs (HTTP-based programmatic interfaces) or reporting over central data models are required, a file-based approach quickly becomes a bottleneck.
- Maintainability and knowledge risk: Many Paradox/BDE solutions rely on a small number of people who know data access, table maintenance and failure modes. If that knowledge is lost, operational uncertainty rises.
- Scaling and concurrency: More users, more sites, more automation — all of this increases concurrent access. That is precisely where file-based databases are vulnerable in day-to-day operation.
Crucial: Modernization is rarely an “everything new” project. In practice, a path that controls data risks and gradually moves business logic into a resilient architecture proves successful.
Taking stock: which Paradox variant is actually present?
“We have Paradox” can mean very different things technically. For planning it is important not to view the system only as a database, but as a composite of data, access layer and operating environment.
Technical components you should capture accurately
- Storage and path structure: Where are tables, indexes, temporary files located? Locally, on file servers, in DFS structures? Are there multiple copies per site?
- Access layer: Is the Borland BDE used (historical data access layer for Delphi/C++ applications) or alternative drivers? Are there ODBC bridges or custom implementations?
- Client landscape: Which Windows versions, terminal servers/RDS, Citrix, local installations, mixed permission models?
- Concurrent access: How many users concurrently, which batch jobs, which automated exports/imports?
- Table logic: References, key concepts, „soft“ relationships without real constraints, historically evolved field semantics.
- Integrations: Excel exports, CSV imports, DMS archives, mail-merge processes, external systems that access files directly.
This inventory is not a formality. It determines whether a migration is possible in a few controlled steps or whether data quality and access paths must first be stabilized.
Modernization goals: What „finished“ means before you start
Many projects do not fail because of technology but because of unclear target definitions. „Moving away from Paradox“ is not a goal, but a wish. For reliable planning you should specify which characteristics should apply after modernization.
Pragmatic target criteria for operations and IT governance
- Central, transactional data core: Data changes go through a server database with transactions (atomic, consistent changes) and defined locking logic.
- Clear authorizations: Roles, multi-tenancy (if required), logging of accesses and changes.
- Backup and RESTore with defined windows: Not „copy somewhere“, but recovery tests, RPO/RTO (data loss and RESTart objectives) and defined responsibilities.
- Integration via interfaces: Instead of file access by external processes: defined APIs or import/export processes with validation.
- Release and change process: Database migrations versioned, rollback strategies documented, test environments realistic.
The clearer these criteria, the easier the decision whether to first perform a „BDE-Ablösung“ at the access level or to move directly toward a client-server migration.
Modernizing Paradox databases: Three proven target architectures
In practice, three target patterns have emerged. Which variant fits depends on data volume, degree of integration, and modernization pressure. Important: you can combine the variants or use them as intermediate steps.
1) „Stabilize and decouple“: modernize the access layer, retain data for now
If the business unit will not tolerate changes and operations are currently „just about“ working, a first step can be to decouple the access layer and reduce risks. This often includes the BDE replacement: the BDE is replaced by more modern data access methods so that operation on current Windows versions and in hardened environments can be better controlled. Technically, this is often planned as a BDE replacement with native integration (a Delphi data access component with drivers and a unified API) or other native driver layers, without having to immediately redesign the business process.
This is not an end state. But it can buy time: less dependency on old installation routines, better logging, clearer configuration, and often improved error visibility in operation.
2) „Client-Server core“: Migration to SQL Server or PostgreSQL
The most common sustainable path is to migrate the tables into a server database, such as Microsoft SQL Server or PostgreSQL. Both provide transactional guarantees, centralized permissions, consistent indexes, clean backup strategies and better integration options. For companies this mainly means operational gains: monitoring, replication, clear responsibilities and less risk from file-server effects.
Important: data migration is only half the work. Equally relevant is adapting the application logic to true transactions, server-side constraints and a clearer data model.
3) „Service layer first“: API before client, gradual modernization
If multiple applications access the Paradox data or new portals/automations are planned, a service layer can be the first structuring step. This means a central REST service (HTTP interface) that encapsulates read/write operations. This pushes back direct table access and creates a controlled integration layer. This option is particularly useful when new web portals or external interfaces are to be introduced while the desktop client remains in place for a time.
The database migration can then follow behind it without having to touch every integration again.
Data migration: From file-based to relational – typical pitfalls
Paradox datasets are often „functionally correct“ but technically inconsistent. When migrating into a relational server database, this inconsistency becomes visible. Underestimating it generates post-migration support cases, because lists sort differently, duplicates appear or reports suddenly diverge.
1) Keys, duplicates and „historically permitted“ ambiguities
In many Paradox systems there are no strict primary keys or they were not used consistently. In SQL Server/PostgreSQL unique keys are central: for performance, references and data integrity. Common tasks:
- Identifying duplicates in fields that appear unique (e.g. customer or document numbers).
- Defining primary keys (natural vs. technical IDs) and handling legacy data.
- Introducing foreign keys (relationship rules) where functionally sensible — or a deliberate omission with compensating logic.
This is less „database theory“ than operational reality: without clear keys, later interfaces, synchronizations and audits become expensive.
2) Character sets, special characters and collation
Especially in older installations, character sets and sorting rules have evolved historically. After migration the sorting (Collation) can change: umlauts, ß, uppercase/lowercase or accent marks behave differently. To users this appears as an error, although the data are correct. Therefore plan:
- Definition of a consistent collation in the target database.
- Alignment of search logic (exact vs. „case-insensitive“).
- Tests with real data, not only with demo datasets.
3) Date and number formats, rounding, empty values
File-based systems often tolerate values that do not fit readily into a server database: empty date fields, numbers stored as text, mixed decimal separators. In the migration you need transformation rules and a clear strategy for what „unknown“ means (NULL, 0, empty string). This is technically relevant because it affects analyses and downstream processes.
4) Locking and concurrency: behavior changes
Paradox locking and server-database transactions work differently. In a server database there are clearly defined isolation levels (rules for how concurrent accesses see each other). This affects:
- concurrent editing of master data,
- batch runs (e.g. batch invoicing),
- long transactions caused by „open“ forms in the client.
This is not a reason against migration—but it is an argument to engage early with the business units about user guidance, locking concepts and conflict messages.
Parallel operation instead of Big Bang: reduce risk in a controlled way
In enterprise environments, a cutover „over a weekend“ is rarely realistic. A parallel operation reduces risk when it is properly planned. The objective is not to run two worlds permanently, but a transitional phase with clear rules.
Practical patterns for parallel operation
- Read-only mirror: The new database is populated from Paradox and used for reporting/BI. Write operations initially remain in the legacy system. This is a good entry point to validate data quality, mapping and performance.
- Write-through via a layer: Write operations run through a central logic that serves both Paradox and the target database. This is more demanding but can reduce dependencies.
- Module-by-module switch: Certain processes (e.g. order entry) switch first, others follow. Prerequisite: clear interfaces between modules and stable data ownership per process.
It is important to have an unambiguous „System of Record“ per data area: it must be clear which data source is authoritative. Otherwise divergences arise that you will have to correct later with effort.
Rollback, backups and traceability: what IT operations really need
Modernization is accepted in operations only when emergency paths are clear. That includes not only backups but also traceable changes to data and schema.
Minimum requirements you should define before the Cutover
- Recovery plan: Who does what, in which order, with which accesses? A RESTore is a process, not a feature.
- Recovery test: Not theoretical, but in a staging environment with realistic data sets.
- Schema versioning: Database changes are versioned and rolled out reproducibly. This reduces surprises during hotfixes.
Especially with Paradox legacy systems, „traceability“ is often handled implicitly via files, backups and tribal knowledge. In a modern environment it should be made explicit.
Interface modernization: move away from file access toward controlled data flows
Many risks in Paradox environments do not originate in the core system, but from „side processes“: Excel macros, imports from external systems, batch jobs that touch tables directly. In a migration, these accesses must be identified and replaced.
What you should clarify systematically for integrations
- Which systems actually read/write? Not only officially, but also in „unofficial“ departments.
- Which data flows are critical? For example: master data vs. business documents vs. status messages.
- Which validations are missing today? File-based imports often bypass plausibility checks, which later lead to junk data.
- How is error handling performed? Modern interfaces require acknowledgements, retries and clear error messages.
A sensible target state is an API or service layer that centralizes data access. This is also relevant from a security perspective: instead of unrestricted access permissions and scattered credentials, you work with centralized identities and logged requests.
Technical migration planning: an approach that works in practice
Enterprise software cannot be migrated like a laboratory project. You need an approach that integrates business acceptance, operational preparation and technical implementation.
A practical workflow in six stages
- Discovery and risk analysis: data sources, accesses, dependencies, critical processes, operational concept.
- Target state and migration boundary: Which data areas move first, which remain for now? Definition of the authoritative data source.
- Data model and mapping: tables, keys, data types, transformation rules, historization.
- Technical trial run: migration in staging, performance tests, reconciliation of reports and core processes.
- Parallel operation with measurement points: logging, error classes, data comparison, defined abort criteria.
- Cutover and stabilization: switchover, monitoring, remediation, disabling legacy accesses, documentation for operations.
This approach is intentionally iterative: the earlier you test real data and real processes, the lower the risk that the „last 10%“ will cause major problems.
Tooling and operations: monitoring, performance and access control from the start
A common mistake is to treat the new server database like a „better file store.“ Server databases require operational concepts: monitoring, capacity planning, index maintenance, rights management. This is not overhead, but prevents the typical „after three months it gets slow“ effects.
Concrete operational points you should plan for
- Monitoring: connection counts, slow queries, lock conflicts, memory and I/O load.
- Index and statistics maintenance: for stable performance as data grows.
- Permissions and roles: minimal privileges, separation of read/write roles, document administrative access.
- Environment strategy: Dev/Test/Staging/Production with a clear data strategy (masking, partial copies, anonymized data).
For IT management and admins this is often the biggest benefit: instead of hard-to-explain file server issues there are measurable metrics and standardized operational processes.
What you must avoid
Some patterns reappear in modernization projects—and they cost time, money and trust. Three points are particularly relevant:
- Migration without a data-quality check: If duplicates and special cases only become apparent after cutover, the burden lands on support and the business unit. Better: produce early data-quality reports and assess them together.
- Turning off legacy accesses too early without a plan: Many “small” processes access tables directly. If those are missing on Monday, chaos follows. Identify ancillary processes and provide alternative paths.
- Unclear responsibilities between operations and the project: Who decides on performance issues? Who is allowed to roll out schema changes? Define this before the first production cutover.
Assessment for Delphi/BDE assets: Modernize without a complete rewrite
Many Paradox installations depend on Delphi desktop applications. Important: modernization does not automatically mean rewriting. Often a gradual refactor is viable when architecture and data access are clearly separated. A clean layering (e.g. Layer-3 architecture: UI, business logic, data access) helps implement the database migration in a controlled way without touching the entire system at once.
When a BDE replacement is due, it is also worth reviewing centralized configurability, logging and driver strategy so that new databases (SQL Server, PostgreSQL) can be operated on every client without “special installations”.
Conclusion: Modernization is an operations project — with data at its core
Paradox systems are often so long-lived because they model processes reliably. You should protect that domain stability. A successful modernization therefore does not focus on “replacing technology”, but on controlled data ownership, clean integrations and operations that are measurable, restorable and secure. The pragmatic path follows a clear inventory, a target vision with operational criteria, a migration with data-quality rules and — where necessary — parallel operation with a defined rollback.
If you want to evaluate your starting point (data, accesses, BDE/Delphi dependencies, integrations) in a structured way, a short technical pre-meeting is often the fastest step to clarify risks and sensible migration cuts: get in touch.
In the technical context, Paradox database migration and Borland BDE replacement also play an important role when integrations, data flows and further development must work together cleanly.
Discuss a project or modernization initiative with Net-Base.
Next step
When the topic becomes an actual project, architecture, existing systems and operations should be considered together from the outset.
We support not only with individual issues, but also when source snippets, legacy topics, or portal ideas are to be turned into a robust enterprise project.
- Current state, target state and technical risks are assessed jointly.
- REST, data access, portals and rollout are not deferred to a later stage as secondary consequences.
- You can see early on which path is economically and operationally viable.