Data access dilemma
by Marco Cantu
Traditionally, Delphi applications used the BDE to
access databases. But with Delphi 5 there's a new option --
ADO.
Since the release of Delphi 5, which includes the
ADOExpress technology (part of Delphi Enterprise and sold as a
separate option to owners of Delphi Professional), programmers
have been faced with the choice of using the BDE or ADO for
database access. Typically, the answer to the question "Which
database technology should I use?" is "It depends."
The BDE has a long and glorious history. It
originated in Delphi 1 as an engine for accessing Paradox
databases and was later part of the ISAPI initiative involving
IBM, Novell, and WordPerfect. Despite a few problems, the BDE
is one of the reasons for Delphi's success in the database
arena and, having reached version 5, it is a mature
technology. Although there are deployment and a few
programming issues that need fixing, Delphi programmers have
learned to live with the BDE.
A few blemishes
So why move away from the BDE? Deploying it on rented
Internet servers is often impossible because of ISPs' concerns
about running system-level services on their servers. Although
the BDE has been updated to support features like the Oracle 8
object-relational model, some of its features are still bound
to its Paradox roots. For example, the way numeric database
fields are mapped to data types creates compatibility problems
when your Delphi code works with different SQL servers.
Another problem is that the BDE includes the entire
engine used by Paradox and dBase to access data. There is no
way to deploy a thin version of the BDE excluding Paradox
support if you are targeting only SQL servers. (On the other
hand some of these problems, such as running SQL Server on an
ISP's server, apply to using ADO as well.)
Finally, with the advent of Kylix (the technology initiative behind
Delphi and C++Builder for Linux) we'll see a version of Delphi
which won't be able to use the BDE, but will apparently be
based on a new lightweight engine. If the BDE is not in
Delphi's future in Linux, it can hardly be considered the
future in Windows. Borland keeps promising the BDE is here to
stay, but over the last couple of years it has seen little
development.
ActiveX Data Objects (ADO) is part of Microsoft's Universal
Data Access initiative. It provides a simplified framework
for data access based on OLE DB, the real power horse behind
the scene. Programming directly for the OLE DB layer is
complicated so Microsoft has provided a simpler solution.
In providing the ADOExpress technology in Delphi, Borland
has accepted ADO as a common technology and has also
acknowledged Microsoft's Access as a widespread database
engine. Although in the past you could use Access databases
via the BDE, the capabilities were limited. Microsoft also
placed a few roadblocks in the way -- like hiding the
new version of DAO, the Access front end generally used by
Visual Basic -- to push all the other Windows development tool
providers towards ADO.
In any case, ADO is an interesting technology. It is
reasonably lightweight, quite powerful, allows access to data
beyond relational databases, and Microsoft is trying to push
it as an open standard. You can even write OLE DB providers
for ADO in Delphi.
Loss of control
Although ADO is a smart solution, there's one thing I don't
like: You lose a lot of the control that the BDE offers. The
BDE is limited in its ability to update the result of a query,
so to use live queries in Delphi you often attach an UpdateSql
component -- with the SQL statements for updating, inserting,
and deleting records -- to the Query component. This might
seem like an inconvenience, but it actually allows you to
fine-tune your application considerably. ADO, on the other
hand, does a lot of work to let you update the result of a
query without any extra coding, but you don't have control of
the SQL code sent back to the servers unless you place your
own solution on top of it -- giving up the live queries. Some
fine tuning is available in ADO by setting dataset, cursor,
and locking options, but these features behave differently on
different SQL servers and appear to be fine-tuned for
Microsoft SQL Server and Access.
This last is a point to consider: Although using ADO to
access multiple database back-ends is a good idea, there are a
number of ADO features which seem to be specifically related
to Access. For instance, Access is the only database I know
where you have the option of locking the database records as
you read them just in case you want to edit them in the
future. Just as the BDE includes some Paradox-related
features, ADO includes several features which are more
Access-oriented than a universal data access solution should
provide.
Some of the more interesting features of ADO relate to the
use of client-side cursors. You can download an entire dataset
to the client computer and perform a number of operations on
this cache including sorting, filtering, and editing the data.
You can even create a snapshot of the data in a local file and
work offline from the server. There are examples of how to do
this in the Delphi 5 demos and on my site.
The BDE also does local caching but won't allow you to
interact with it. However, a few Delphi programmers have
learned to use the ClientDataSet component to operate on
cached data. I've researched the subject and come to the
conclusion that the ClientDataSet does everything the ADO
client-side cursor does including sorting, filtering, and
local snapshots. Both approaches allow you to define a local
database mapped to a file with no connection to a database
backend. Both have support for XML -- albeit in different
ways. Both can be used for building a three-tier application.
And both provide nested tables to represent master-detail
views of the data.
In addition, the ClientDataSet component offers some
advanced features not found in ADO: grouping, aggregates,
calculated fields, and support for abstract data types (here's
an example).
The ClientDataSet and its related provider component allow
much more control than in ADO. It's not only possible to
specify exactly how updates are applied, but you have greater
support for handling update conflicts.
A plethora of options
ADO and the BDE are not the only alternatives to data
access in Delphi. There are other dataset components available
from Borland and third parties for direct access to SQL
servers like Oracle and InterBase. There are also alternatives
to ADO, access solutions that provide direct DAO support,
and alternative approaches ranging from Btrieve to
AS/400 support. But I still haven't found a solution for
direct OLE DB access.
The common denominator for database access in Delphi is no
longer the BDE. Instead, it's the TDataset class. I've even
written a couple of datasets for accessing non-database data.
You certainly don't need ADO and a specific OLE DB provider
for this.
Oracle, one of the preferred back-ends for Delphi
applications, enjoys such widespread use that I suspect the
success of the ADO strategy depends largely on Oracle's
support -- at least from the perspective of Delphi developers.
Apparently, the Microsoft-supplied OLE DB provider for Oracle
is currently neither a robust nor a complete solution. If
Oracle doesn't push ADO, the future of this technology won't
look so bright. And with Microsoft gearing ADO towards its own
database solutions, Oracle's resistance to promoting ADO is
understandable.
ADO's greatest advantage is that it's ubiquitous to Windows
and is promoted by Microsoft. If you're accessing Microsoft
SQL Server or Access databases, you'll probably prefer to use
ADO. If you're using Paradox or InterBase, then the BDE is
probably still the best bet -- unless you've boarded the
InterBase Express. As with so many questions in the software
biz, the answer to "Which database technology should I use?"
is: "It depends."
Originally written for InPublishing LLC for publication by Inprise Corp. Copyright 1999 Inprise Corp.
|