Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Une session de fournisseur OLE DB SQL Server Native Client représente une connexion unique à une instance de SQL Server.
Le fournisseur OLE DB SQL Server Native Client nécessite que les sessions délimitent l’espace de transaction pour une source de données. Tous les objets de commande créés à partir d’un objet de session spécifique participent à la transaction locale ou distribuée de l’objet de session.
Le premier objet de session créé sur la source de données initialisée reçoit la connexion SQL Server établie lors de l’initialisation. Lorsque toutes les références sur les interfaces de l’objet de session sont publiées, la connexion à l’instance de SQL Server devient disponible pour un autre objet de session créé sur la source de données.
Un objet de session supplémentaire créé sur la source de données établit sa propre connexion à l’instance de SQL Server, comme spécifié par la source de données. La connexion à l’instance de SQL Server est supprimée lorsque l’application libère toutes les références aux objets créés par cette session.
L’exemple suivant montre comment utiliser le fournisseur OLE DB SQL Server Native Client pour se connecter à une base de données SQL Server :
int main()
{
// Interfaces used in the example.
IDBInitialize* pIDBInitialize = NULL;
IDBCreateSession* pIDBCreateSession = NULL;
IDBCreateCommand* pICreateCmd1 = NULL;
IDBCreateCommand* pICreateCmd2 = NULL;
IDBCreateCommand* pICreateCmd3 = NULL;
// Initialize COM.
if (FAILED(CoInitialize(NULL)))
{
// Display error from CoInitialize.
return (-1);
}
// Get the memory allocator for this task.
if (FAILED(CoGetMalloc(MEMCTX_TASK, &g_pIMalloc)))
{
// Display error from CoGetMalloc.
goto EXIT;
}
// Create an instance of the data source object.
if (FAILED(CoCreateInstance(CLSID_SQLNCLI10, NULL,
CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)
&pIDBInitialize)))
{
// Display error from CoCreateInstance.
goto EXIT;
}
// The InitFromPersistedDS function
// performs IDBInitialize->Initialize() establishing
// the first application connection to the instance of SQL Server.
if (FAILED(InitFromPersistedDS(pIDBInitialize, L"MyDataSource",
NULL, NULL)))
{
goto EXIT;
}
// The IDBCreateSession interface is implemented on the data source
// object. Maintaining the reference received maintains the
// connection of the data source to the instance of SQL Server.
if (FAILED(pIDBInitialize->QueryInterface(IID_IDBCreateSession,
(void**) &pIDBCreateSession)))
{
// Display error from pIDBInitialize.
goto EXIT;
}
// Releasing this has no effect on the SQL Server connection
// of the data source object because of the reference maintained by
// pIDBCreateSession.
pIDBInitialize->Release();
pIDBInitialize = NULL;
// The session created next receives the SQL Server connection of
// the data source object. No new connection is established.
if (FAILED(pIDBCreateSession->CreateSession(NULL,
IID_IDBCreateCommand, (IUnknown**) &pICreateCmd1)))
{
// Display error from pIDBCreateSession.
goto EXIT;
}
// A new connection to the instance of SQL Server is established to support the
// next session object created. On successful completion, the
// application has two active connections on the SQL Server.
if (FAILED(pIDBCreateSession->CreateSession(NULL,
IID_IDBCreateCommand, (IUnknown**) &pICreateCmd2)))
{
// Display error from pIDBCreateSession.
goto EXIT;
}
// pICreateCmd1 has the data source connection. Because the
// reference on the IDBCreateSession interface of the data source
// has not been released, releasing the reference on the session
// object does not terminate a connection to the instance of SQL Server.
// However, the connection of the data source object is now
// available to another session object. After a successful call to
// Release, the application still has two active connections to the
// instance of SQL Server.
pICreateCmd1->Release();
pICreateCmd1 = NULL;
// The next session created gets the SQL Server connection
// of the data source object. The application has two active
// connections to the instance of SQL Server.
if (FAILED(pIDBCreateSession->CreateSession(NULL,
IID_IDBCreateCommand, (IUnknown**) &pICreateCmd3)))
{
// Display error from pIDBCreateSession.
goto EXIT;
}
EXIT:
// Even on error, this does not terminate a SQL Server connection
// because pICreateCmd1 has the connection of the data source
// object.
if (pICreateCmd1 != NULL)
pICreateCmd1->Release();
// Releasing the reference on pICreateCmd2 terminates the SQL
// Server connection supporting the session object. The application
// now has only a single active connection on the instance of SQL Server.
if (pICreateCmd2 != NULL)
pICreateCmd2->Release();
// Even on error, this does not terminate a SQL Server connection
// because pICreateCmd3 has the connection of the
// data source object.
if (pICreateCmd3 != NULL)
pICreateCmd3->Release();
// On release of the last reference on a data source interface, the
// connection of the data source object to the instance of SQL Server is broken.
// The example application now has no SQL Server connections active.
if (pIDBCreateSession != NULL)
pIDBCreateSession->Release();
// Called only if an error occurred while attempting to get a
// reference on the IDBCreateSession interface of the data source.
// If so, the call to IDBInitialize::Uninitialize terminates the
// connection of the data source object to the instance of SQL Server.
if (pIDBInitialize != NULL)
{
if (FAILED(pIDBInitialize->Uninitialize()))
{
// Uninitialize is not required, but it fails if an
// interface has not been released. Use it for
// debugging.
}
pIDBInitialize->Release();
}
if (g_pIMalloc != NULL)
g_pIMalloc->Release();
CoUninitialize();
return (0);
}
La connexion d’objets de session de fournisseur OLE DB SQL Server Native Client à une instance de SQL Server peut générer une surcharge significative pour les applications qui créent et libèrent continuellement des objets de session. La surcharge peut être réduite en gérant efficacement les objets de session du fournisseur OLE DB SQL Server Native Client. Les applications de fournisseur OLE DB SQL Server Native Client peuvent conserver la connexion SQL Server d’un objet de session active en conservant une référence sur au moins une interface de l’objet.
Par exemple, la gestion d’un pool de références d’objets de création de commandes conserve les connexions actives pour ces objets de session dans le pool. Comme les objets de session sont requis, le code de maintenance du pool transmet un pointeur d’interface IDBCreateCommand valide à la méthode d’application nécessitant la session. Lorsque la méthode d’application ne nécessite plus la session, la méthode retourne le pointeur d’interface vers le code de maintenance du pool plutôt que de libérer la référence de l’application à l’objet de création de commande.
Remarque
Dans l’exemple précédent, l’interface IDBCreateCommand est utilisée, car l’interface ICommand implémente la méthode GetDBSession , la seule méthode dans l’étendue d’ensemble de commandes ou de lignes qui permet à un objet de déterminer la session sur laquelle elle a été créée. Par conséquent, un objet de commande, et uniquement un objet de commande, permet à une application de récupérer un pointeur d’objet source de données à partir duquel des sessions supplémentaires peuvent être créées.