The latest version of MDAC (2.8) consists of several interacting components, all of which are
Windows specific except for
ODBC (which is available on several platforms). MDAC architecture may be viewed as three layers: a programming interface layer, consisting of
ADO and
ADO.NET, a database access layer developed by database vendors such as Oracle and Microsoft (
OLE DB, .NET managed providers and
ODBC drivers), and the database itself. These component layers are all made available to applications through the MDAC
API. The
Microsoft SQL Server Network Library, a proprietary access method specific to Microsoft SQL Server, is also included in the MDAC. Developers of Windows applications are encouraged to use ADO or ADO.NET for data access, the benefit being that users of the application program are not constrained in their choice of database architecture except that it should be supported by MDAC. Naturally, developers still have the choice of writing applications which directly access OLE DB and ODBC.
Microsoft SQL Server Network Library The Microsoft SQL Server Network Library (also known as Net-Lib) is used by the Microsoft SQL Server to read and write data using many different
network protocols. Though Net-Lib is specific to the SQL Server, Microsoft includes it with MDAC. The SQL Server uses the Open Data Services (ODS) library to communicate with Net-Lib, which interfaces directly with the
Windows NT operating system line's
Win32 subsystem. The SQL Server Network Library is controlled through the use of a Client Network Utility, which is bundled with the SQL Server. Each Net-Lib supported network protocol has a separate driver (not to be confused with a
device driver), and has support for a
session layer in its protocol stack. There are two general types of Net-Lib: the primary and the secondary. The primary Net-Lib consists of a
Super Socket Net-Lib and the
Shared Memory Net-Lib, while there are numerous secondary Net-Libs, including
TCP/IP and
named pipes network libraries (named pipes are a method of communicating with other processes via a system-persistent
pipeline that is given an identity). The Microsoft OLE DB Provider for SQL Server (SQLOLEDB) communicates via primary Net-Libs. The Super Socket Net-Lib deals with inter-computer communications and coordinates the secondary Net-Libs – though the TCP/IP secondary Net-Lib is an exception in that it calls on the
Windows Sockets 2 API directly. The
Banyan VINES,
AppleTalk,
ServerNet,
IPX/SPX,
Giganet, and
RPC Net-Libs were dropped from MDAC 2.5 onwards. The Network Library router had the job of managing all these protocols, however now only the named pipes secondary Net-Lib is managed by the router. The Super Socket Net-Lib also handles
data encryption via the use of the Windows
SSL API. The Shared Memory Net-Lib, on the other hand, manages connections between multiple instances of SQL Server that exist on one computer. It uses a
shared memory area to communicate between the processes. This is inherently secure; there is no need for data encryption between instances of SQL Server that exist on one computer as the operating system does not allow any other process access to the instances' area of shared memory. Net-Lib is also able to support the impersonation of a logged in user's security context for protocols that support authenticated connections (called
trusted connections). This allows Net-Lib to provide an integrated logon authentication mechanism via the use of
Windows Authentication. Windows Authentication is not supported on Windows 98 or Windows Me.
OLE DB OLE DB (also called OLEDB or OLE-DB) allows MDAC applications access to different types of
data stores in a uniform manner. Microsoft has used this technology to separate the application from data can store in the website the data store that it needs to access. This was done because different applications need access to different types and sources of data, and do not necessarily need to know how to access technology-specific functionality. The technology is conceptually divided into
consumers and
providers. The consumers are the applications that need access to the data, and the provider is the software component that exposes an OLE DB interface through the use of the
Component Object Model (or COM). OLE DB is the database access interface technology used by MDAC. OLE DB providers can be created to access such simple data stores as a text file or
spreadsheet, through to such complex databases as
Oracle and
SQL Server. However, because different data store technology can have different capabilities, OLE DB providers may not implement every possible interface available. The capabilities that are available are implemented through the use of COM objects an OLE DB provider will map the data store technology's functionality to a particular COM interface. Microsoft calls the availability of an interface to be "provider-specific" as it may not be applicable depending on the database technology involved. Additionally, however, providers may also augment the capabilities of a data store; these capabilities are known as
services in Microsoft parlance. The
Microsoft OLE DB Provider for SQL Server (SQLOLEDB) is the OLE DB provider that Microsoft provides for the
Microsoft SQL Server from version 6.5 upwards.
Universal data link Universal data link files (or '.udl files') provide a common user interface for specifying connection attributes. A user can use a Data Link Properties
dialog box to save connection information in a .udl file as an alternative to directly specifying them by hand in a connection string. Consequently, these files provide a convenient level of
indirection. Additionally, the dialog box specifies a number of alternate OLE DB data providers for a variety of target applications.
ODBC Open Database Connectivity (ODBC) is a native interface that is accessed through a
programming language (usually
C) that can make calls into a
native library. In MDAC this interface is defined as a DLL. A separate module or
driver is needed for each database that must be accessed. The functions in the ODBC API are implemented by these DBMS-specific drivers. The driver that Microsoft provides in MDAC is called the SQL Server ODBC Driver (SQLODBC), and (as the name implies) is designed for Microsoft's SQL Server. It supports SQL Server v6.5 and upwards.
ADO ActiveX Data Objects (
ADO) is a high-level programming interface to OLE DB. It uses a hierarchical
object model to allow applications to programmatically
create, retrieve, update and delete data from sources supported by OLE DB. ADO consists of a series of hierarchical COM-based objects and collections, an object that acts as a container of many other objects. A programmer can directly access ADO objects to manipulate data, or can send an
SQL query to the database via several ADO mechanisms. ADO is made up of nine objects and four
collections. The collections are: •
Fields: This collection contains a set of Field objects. The collection can be used in either a Recordset object or in a Record object. In a Recordset object, each of the Field objects that make up the Fields collection corresponds to a column in that Recordset object. In a Record object, a Field can be an absolute or relative URL that points into a tree-structured namespace (used for
semi-structured data providers like the Microsoft OLE DB Provider for Internet Publishing) or as a reference to the default Stream object associated with that Record object. •
Properties: An object can have more than one Property object, which are contained in the object's Properties collection. •
Parameters: A Command object can have several Parameter commands to change its predefined behaviour, and each of the Parameter objects are contained in the Command object's Parameters collection •
Errors: All provider created errors are passed to a collection of Error objects, while the Errors collection itself is contained in a Connection object. When an ADO operation creates an error, the collection is cleared and a new group of Error objects are created in the collection. The objects are: •
Connection: The connection object is ADO's connection to a data store via OLE DB. The connection object stores information about the session and provides methods of connecting to the data store. As some data stores have different methods of establishing a connection, some methods may not be supported in the connection object for particular OLE DB providers. A connection object connects to the data store using its 'Open' method with a connection string which specifies the connection as a list of key value pairs (for example: "Provider='SQLOLEDB';Data Source='TheSqlServer'; Initial Catalog='Northwind';Integrated Security='SSPI';"). The start of which must identify the type of data store connection that the connection object requires. This must be either: • an OLE DB provider (for example SQLOLEDB), using the syntax "provider=" • a file name, using the syntax "file name=" • a remote provider and server (see
RDS), using the syntax "Remote provider=" and "Remote server=" • an absolute
URL, using the syntax "URL=" •
Command: After the connection object establishes a session to the data source, instructions are sent to the data provider via the command object. The command object can send SQL queries directly to the provider through the use of the
CommandText property, send a parameterised query or
stored procedure through the use of a
Parameter object or
Parameters collection or run a query and return the results to a dataset object via the
Execute method. There are several other methods that can be used in the Command object relating to other objects, such as the Stream, RecordSet or Connection objects. •
Recordset: A
recordset is a group of records, and can either come from a base table or as the result of a query to the table. The RecordSet object contains a
Fields collection and a
Properties collection. The Fields collection is a set of Field objects, which are the corresponding
columns in the table. The Properties collection is a set of Property objects, which defines a particular functionality of an OLE DB provider. The RecordSet has numerous methods and properties for examining the data that exists within it. Records can be updated in the recordset by changing the values in the record and then calling on the Update or UpdateBatch method. Adding new records is performed through the AddNew function and then by calling on the Update or UpdateBatch method. Records are also deleted in the recordset with the Delete method and then by calling on the Update method. However, if for some reason the deletion cannot occur, such as because of violations in
referential integrity, then the recordset will remain in edit mode after the call to the Update method. The programmer must explicitly call on the CancelUpdate function to cancel the update. Additionally, ADO can roll back transactions (if this is supported) and cancel batch updates. Recordsets can also be updated in one of three ways: via an immediate update, via a batch update, or through the use of transactions: •
Immediate: The recordset is locked using the adLockOptimistic or adLockPessimistic lock. The data are updated at the data source after the record is changed and the Update method is called. •
Batch: The recordset is locked using adLockBatchOptimistic and each time Update is called the data are updated in a temporary buffer. Finally, when UpdateBatch is called the data are completely updated back at the data source. This has the advantage of it all being done in memory, and if a problem occurs then UpdateCancel is called and the updates are not sent to the data source •
Transaction: If the OLE DB provider allows it,
transactions can be used. To start the transaction, the programmer invokes the BeginTrans method and does the required updates. When they are all done, the programmer invokes the CommitTrans method. RollbackTrans can be invoked to cancel any changes made inside the transaction and
roll back the database to the state before the transaction began •
Record: This object represents one
record in the database, and contains a fields collection. A RecordSet consists of a collection of Record objects. •
Stream: A stream, mainly used in a RecordSet object, is a means of reading and writing a stream of bytes. It is mostly used to save a recordset in an XML format, to send commands to an OLE DB provider as an alternative to the CommandText object and to contain the contents of a binary or text file. •
Parameter: A parameter is a means of altering the behaviour of a common piece of functionality, for instance a stored procedure might have different parameters passed to it depending on what needs to be done; these are called
parameterised commands. •
Field: Each Record object contains many fields, and a RecordSet object has a corresponding Field object also. The RecordSet object's Field object corresponds to a
column in the database table that it references. •
Property: This object is specific to the OLE DB provider and defines an ability that the provider has implemented. A property object can be either a
built-in property – it is a well defined property implemented by ADO already and thus cannot be altered – or a
dynamic property – defined by the underlying data provider and can be changed •
Error: When an OLE DB provider
error occurs during the use of ADO, an Error object will be created in the Errors collection. Other errors do not go into an Error object, however. For instance, any errors that occur when manipulating data in a RecordSet or Field object are stored in a Status property.
ADO.NET ADO.NET is the latest version of ADO (after ADO 2.8, now often referred to as ADO Classic) and is part of the MDAC 2.8 stack alongside classic ADO. It is built around
Microsoft .NET. Though sometimes seen as an evolutionary step up from ADO, some fundamental structural changes were made by Microsoft. ADO.NET runs through a .NET Managed Provider, a modified version of an OLE DB provider specifically designed for .NET. The object structure is no longer built around a Recordset object. Instead a Dataset object is used to contain data gathered from multiple sources. This is transparent to the programmer. Unlike the old ADO Recordset, the Dataset's design promotes the use of disconnected data. Conceptually, a Dataset object can be seen as a small in-memory relational database in its own right that allows for manipulation of data in any direction. In order to propagate changes back into the database, a
DataAdapter object is used that transfers data from between the data source and the DataSet object.
Cursors were also deprecated in ADO.NET, being replaced with a
DataReader object, which is used to efficiently process a large list of results one record at a time without storing them. ==Deprecated and obsolete components==