Standard Programming Interface
One of the requirements for ODBC was that a single application binary had to
work with multiple DBMSs. It is for this reason that ODBC does not use embedded
SQL or module languages. Although the language in embedded SQL and module
languages is standardized, each is tied to DBMS-specific precompilers. Thus,
applications must be recompiled for each DBMS and the resulting binaries work only
with a single DBMS. While this is acceptable for the low-volume applications found
in the mini-computer and mainframe worlds, it is unacceptable in the personal
computer world. First, it is a logistical nightmare to deliver multiple
versions of high-volume, “shrink-wrapped” software to customers; second, personal
computer applications often need to access multiple DBMSs simultaneously.
On the other hand, a call-level interface can be implemented through
libraries, or database drivers, that reside on each local machine; a different driver is required for each
DBMS. Because modern operating systems can load such libraries (such as
dynamic-link libraries on the Windows operating system) at runtime, a single
application can not only access data from different DBMSs without recompilation, but can
also access data from multiple databases simultaneously; as new database
drivers become available, users can just install these on their computers without
having to modify, recompile, or relink their database applications. Furthermore, a
call-level interface was a good candidate for ODBC because Windows—the
platform for which ODBC was originally developed—already made extensive use of such
libraries.