OLE DB 2.0 Architecture - Supporting Remote Data Exchange
arunsnarayanan
3 views
50 slides
Mar 11, 2025
Slide 1 of 50
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
About This Presentation
Microsoft OLE DB stands for Object Linking and Embedding Database and provides a standardised way to represent and work with data from different sources, enabling applications to access and manipulate data in a consistent and efficient manner.
Size: 1.43 MB
Language: en
Added: Mar 11, 2025
Slides: 50 pages
Slide Content
OLE DB 2.0 ARCHITECTURE
Arun Seetharaman
Computer Call
January 20, 1999
Data
access
WINDOWS DNA DATA
ACCESS
AGENDA
➔Review of OLE DB object model
•New in OLE DB 2.0
•Connecting to OLE DB data sources
•Navigating hierarchical data
•OLE DB service components
•Questions and answers
DATA AS A
COMMON ABSTRACTION
•Common representation of data
•Code/knowledge reuse
•Tools can access data generically
•Generic components can add functionality
•Components can combine different types of
data
◆ Sharing data
⚫Reduces memory footprint
⚫Reduces data movement
⚫Better component coordination
TERMINOLOGIES
•Data Provider
•Software that implements OLEDB Interfaces
•Exposes data in a tabular form
◆Consumer
⚫Consumes the data
◆Service Provider
⚫Consumes data exposed by Data Provider
⚫Transforms and provides data
OLE DB DESIGN PHILOSOPHY
•Data stores provide interfaces to
native functionality
•Data store is not required to
implement extended functionality
◆Consumers assume common functionality
⚫Consumers don't need excess conditional code
◆“Service components” augment data store's
native functionality
⚫Generic, reusable components provide a guaranteed
level of interoperability
Data source
IDBCreateSession
Rowset
OpenRowset()
Rowset
Execute()
OLE DB OBJECT MODEL
ICommand
Command
CreateCommand ()
IDBCreateCommand
IOpenRowset
Session
CreateSession()
AGENDA
Review of OLE DB object model
➔New in OLE DB 2.0
➔Connecting to OLE DB data sources
•Navigating hierarchical data
•OLE DB service components
•Questions and answers
CONNECTING TO
A DATA SOURCE
BEFORE 2.0
•Via root enumerator
•Passing provider’s CLSID to CoCreateInstance
•Hard-code provider CLSIDs
•Obtain CLSID via application specific code
◆Disadvantages:
⚫No common UI
⚫No common way to represent or persist
connection information
CONNECTING TO
A DATA SOURCE
OLE DB 2.0
•OLE DB 2.0 provides common services to
connect to data sources:
•IDataInitialize
•Persists connection strings
•Leverages OLE DB services
(More on this later…)
•IDBPromptInitialize
•Uses the data links UI
•Manages data source properties and data link
(*.UDL) files
WHAT CAN I DO WITH
IDATAINITIALIZE ?
•Modify sample consumer
to use IDataInitialize
•Instantiate the OLE DB initialization service
CLSID_MSDAINITIALIZE
One simple change to current code
•Create a Data Source object via
IDataInitialize::CreateDBInstance
// Create the Initialization Component
hr = CoCreateInstance( CLSID_MSDAINITIALIZE, NULL,
CLSCTX_INPROC_SERVER,
IID_IDataInitialize, (void **)&pIDataInit);
if (FAILED(hr))
{… }
// Create an instance of the OLE DB provider for Jet
hr = pIDataInit->CreateDBInstance( CLSID_JETOLEDB_3_51,
NULL, CLSCTX_INPROC_SERVER,
NULL, IID_IDBInitialize, (IUnknown**) &pIDBInit);
if (FAILED(hr))
{… }
WHAT ELSE CAN I DO
WITH IDATAINITIALIZE?
•Given a data source, retrieve a connection string
•GetInitializationString
•Persist a connection string
•WriteStringToStorage
// Use IDataInitialize::GetInitializationString to return connection
string
hr = pIDataInit->GetInitializationString( (IUnknown*)pIDBInit, TRUE,
&pwszInitString);
if (FAILED(hr))
{… }
// Use IDataInitialize::WriteStringToStorage to persist connection string
hr = pIDataInit->WriteStringToStorage(pwszFileName, pwszInitString,
CREATE_ALWAYS);
if (FAILED(hr))
{… }
WHAT ELSE CAN I DO
WITH IDATAINITIALIZE?
•Persist a connection string
•LoadStringFromStorage
•Given a connection string, instantiate a data source object
•GetDataSource
//Create the Initialization Component
hr = CoCreateInstance( CLSID_MSDAINITIALIZE, NULL,
CLSCTX_INPROC_SERVER, IID_IDataInitialize,
(void **)&pIDataInit);
if (FAILED(hr))
{… }
// Read the initialization info from previous example
hr = pIDataInit->LoadStringFromStorage(pwszFileName,
&pwszInitString);
if (FAILED(hr))
{… }
// Create a Data Source object using the initialization string
hr = pIDataInit->GetDataSource(NULL, CLSCTX_INPROC_SERVER,
pwszInitString,IID_IDBInitialize, (IUnknown**) &pIDBInit);
if (FAILED(hr))
{… }
DATA LINKS
•Common UI for data sources
•Can be used by any application
•Reflects properties of the provider
•Connection information can be persisted as “Data links”
Data links can be used from ADO or OLE DB
Invoked from desktop
IDBPROMPTINITIALIZE
•Program access to the Data Links service
•PromptDataSource
•Opens data link properties dialog
•Returns a data link with properties
•PromptFileName
•Opens Select data link dialog
•Returns path to data link (*.UDL) file
DATA LINKS EXAMPLE
•Demonstrate data links UI from Windows
®
desktop
•Data links UI via RowsetViewer
•RowsetViewer is available in the
data access SDK
AGENDA
Review of OLE DB object model
New in OLE DB 2.0
Connecting to OLE DB data sources
➔Navigating hierarchical data
•OLE DB service components
•Questions and answers
NAVIGATING HIERARCHICAL
DATA
•Data is more than just isolated tables
•Hierarchies arrange data “nodes” in a tree
•Modeling hierarchies in OLE DB
OLE DB
IRowset->GetNextRows(chap1,…)
chap1
chap1
IRowset->GetNextRows(chap2,…)
chap2
chap2
IRowset->GetNextRows(chap3,…)
chap3
chap3
OLE DB
.....................
...
...
...
...
HIERARCHIES VIA CHAPTERS
•Efficiently expose hierarchical data through a single rowset
per level
•Appears as child recordsets in ADO 2.0
SHAPE EXAMPLE
SHAPE {select * from Orders}
APPEND({select * from `Order
Details`}RELATE OrderID TO
OrderID)
Orders rowset
OLE DB
......
OLE DB
............
Order details rowset
chap1
chap2
chap3
...
...
...
...
...
chap1
chap2
chap3
SHAPE PROVIDER
•Constructs hierarchical rowsets from data providers
•Driven by Shape data
manipulation syntax
◆Types of Hierarchies
⚫Appends chapter-valued columns to parent
rowset
⚫Generates parent rowset from child rowset
with aggregations
⚫Parameterised Hierarchies
SHAPE EXAMPLE
•Load shape provider’s data link
from storage
•Create a command object
•Set command text with a shape command
•Set any rowset properties
on the command
•Execute the command to obtain
parent rowset
// Create an instance of the OLE DB Initialization Component
hr = CoCreateInstance( CLSID_MSDAINITIALIZE, NULL,
CLSCTX_INPROC_SERVER, IID_IDataInitialize,
(void **)&pIDataInit);
if (FAILED(hr))
{ ...}
// Read the Data Link file for this example:
hr = pIDataInit->LoadStringFromStorage(pwszFileName,
&pwszInitString);
if (FAILED(hr))
{ ...}
// Create a Data Source object using the initialization string
hr = pIDataInit->GetDataSource(NULL, CLSCTX_INPROC_SERVER,
pwszInitString,IID_IDBInitialize, (IUnknown**) &pIDBInit);
if (FAILED(hr))
{ ...}
// Create the command object
hr = pSession->QueryInterface( IID_IDBCreateCommand,(void
**)&pIDBCreateCommand );
if (FAILED(hr))
{ ...}
hr = pIDBCreateCommand->CreateCommand( NULL,
IID_ICommandText, (IUnknown **)&pICommandText);
if (FAILED(hr))
{ ...}
pwsz_CommandText =
L"SHAPE{select * from Orders} COMPUTE (SUM(FREIGHT)) as
CHAPTER by customerID) ";
hr = pICommandText->SetCommandText( guidDialect,
pwsz_CommandText);
if (FAILED(hr))
{ ...}
NAVIGATING CHAPTERS
•IParentRowset::GetChildRowset
returns child rowset
•IRowset:GetNextRows(hChapter…) returns child rows for
that chapter
AGENDA
Review of OLE DB object model
New in OLE DB 2.0
Connecting to OLE DB data sources
Navigating hierarchical data
➔OLE DB service components
•Questions and answers
SERVICE COMPONENTS
•What are service components?
•How do they work?
•2.0 service components
•Client cursor engine
•Resource pooling
•How do I use them?
Service Components make up the difference
Minimum provider interfaces
Service
components
OLE DB consumer
WHAT ARE
SERVICE COMPONENTS?
•A bridge between consumer expectation and provider
capability
WHAT ARE
SERVICE COMPONENTS?
•OLE DB core components that augment a provider’s
functionality
•Work with existing providers
•Without knowledge of the service
•Without special logic
•Work with consumers
•ADO uses them automatically
SERVICE COMPONENTS
•Service component
manager
•Invokes services
as needed
•Handles navigation
between interfaces
implemented by
different objects
•Provides a common
entry point for hooking
other services
•Consumer calls
methods directly
OLE DB rowset
Provider rowset
Service component manager
Service component
Service component
2.0 SERVICE COMPONENTS
•Client cursor engine
•Scrollable cursors
•IRowsetFind implementation
•Updateable rowsets over a SQL provider
◆Resource pooling
⚫Multiple, homogenous pools
⚫Caches provider information
⚫Automatic transaction enlistment in Microsoft
Transaction Server
USING SERVICE COMPONENTS
•Invoking service components
•Create a data source using IDataInitialize or
IDBPromptInitialize
•Use ADO
•Use the data links UI
•Service component manager determines which services to
invoke
•Applications should request the functionality they want
•Via command and rowset properties
DISABLING SERVICE
COMPONENTS
•By provider
•OLEDB_SERVICES registry entry
◆By Consumer
⚫Property control of core services
⚫“OLE DB Services” String
CLIENT CURSOR EXAMPLE
•Connect to a sample provider
•Request backwards scrolling
•Re-connect using service components
•Demonstrate scrolling
OLE DB RESOURCE POOLING
•Improves performance and scaling
•Works with Microsoft Transaction Server
•What is pooled?
•Initialized data source object
Based on connection info
•Associated session object
•Provides multiple, homogenous pools
•Reduces contention
•Manages object lifetimes and
state changes
OLE DB POOLING
•Application
•Calls middle tier object
◆OLE DB services
⚫Returns proxy DSO
⚫Sets initialization properties
⚫Calls Initialize()
⚫Caches information
⚫Sets cached properties
⚫Calls Initialize()
⚫Creates a session
⚫Enlists in transaction
⚫Does work
Windows NT
MTS
◆Middle tier object
⚫Calls CreateDBInstance()
OLE DB services
OLE DB
⚫Creates provider DSO
SQL Server
DSO
Provider
DCOM
MT
O
OLE DB POOLING
•Application
•Calls middle tier object
◆Middle tier object
⚫Calls CreateDBInstance()
◆OLE DB services
⚫Returns proxy DSO
⚫Sets initialization properties
⚫Calls Initialize()
⚫Caches information
⚫Creates Provider DSO
⚫Sets cached properties
⚫Calls Initialize()
⚫Creates a Session
⚫Enlists in transaction
⚫Does work
⚫Goes away
Windows NT
MTS
OLE DB services
OLE DB
SQL Server
DSO
Provider
OLE DB POOLING
Windows NT
MTS
OLE DB services
OLE DB
SQL Server
DSO
Provider
HTTP
Internet
Information
Server
MT
O
Web
browser
⚫Calls middle tier object
⚫Calls CreateDBInstance()
⚫Returns proxy DSO
⚫Sets initialization properties
⚫Calls Initialize()
⚫Caches information
⚫Sets cached properties
⚫Calls Initialize()
⚫Creates a Session
⚫Enlists in transaction
⚫Does work
Provider
OLE DB
DSO
Oracle
◆Creates provider DSO
◆Middle tier object
◆OLE DB Services
◆Web browser
OLE DB POOLING
Windows NT
MTS
OLE DB services
OLE DB
SQL Server
DSO
Provider
Web
browser
⚫Calls middle tier object
⚫Calls CreateDBInstance()
⚫Returns proxy DSO
⚫Sets initialization properties
⚫Calls Initialize()
⚫Caches information
⚫Sets cached properties
⚫Calls Initialize()
⚫Creates a Session
⚫Enlists in transaction
⚫Does work
⚫Goes away
Provider
OLE DB
DSO
Oracle
◆Creates provider DSO
◆Middle tier object
◆OLE DB Services
◆Web browser
OLE DB POOLING
Windows NT
MTS
OLE DB services
OLE DB
SQL Server
Provider
DSO
Web
browser
Provider
DSO
Oracle
DCOM
MT
O
◆Application
⚫Calls middle tier object
◆OLE DB Services
⚫Sets initialization properties
⚫Calls CreateDBInstance()
⚫Caches information
⚫Does work
◆Middle tier object
⚫Returns proxy DSO
⚫Returns DSO from pool DSO
⚫Calls
Initialize()
OLE DB POOLING
Windows NT
MTS
OLE DB services
OLE DB
SQL Server
Provider
DSO
Web
browser
Provider
DSO
Oracle
◆Application
⚫Calls middle tier object
◆Middle tier object
⚫Calls CreateDBInstance()
⚫Sets initialization properties
⚫Calls Initialize()
⚫Does work
⚫Goes away
◆OLE DB services
⚫Returns proxy DSO
⚫Caches information
⚫Returns DSO from pool
Windows NT
MTS
OLE DB services
OLE DB
SQL Server
Provider
DSO
Web
browser
Provider
DSO
Oracle
◆Application
◆Middle tier object
◆OLE DB services
OLE DB POOLING
OLE DB POOLING
OLE DB Services
MTS
Web
browser
Windows NT
OLE DB
DSO
SQL
Server
Provider
◆Application
◆Middle tier object
◆OLE DB services
⚫Oracle connection times out
OLE DB POOLING
OLE DB Services
MTS
Web
browser
Windows NT
◆Application
◆Middle tier object
◆OLE DB services
⚫Oracle connection times out
⚫SQL Server connection
times out
LEVERAGING OLE DB POOLING
•Connect using CreateDBInstance, GetDataSource, or data
links UI
•Don’t request provider specific interfaces prior to
connecting
•Don’t request prompting
•Don’t uninitialize
•Only use one session per connection
•…or, just use ADO!
OLE DB SUMMARY
•OLE DB 2.0 improves the architecture for universal data
access
•Easier access to your data sources
•Ability to model hierarchical data
•Service components
•OLE DB 2.0 service components
•Client cursor engine support for scrolling and searching
•Resource pooling improves performance and scalability
•Leveraging service components is easy