Partilhar via


Sessions

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Baixar driver OLE DB

Um Driver OLE DB para uma sessão SQL Server representa uma única ligação a uma instância do SQL Server.

O Driver OLE DB para SQL Server exige que as sessões delimitem o espaço de transações para uma fonte de dados. Todos os objetos de comando criados a partir de um objeto de sessão específico participam na transação local ou distribuída do objeto de sessão.

O primeiro objeto de sessão criado na fonte de dados inicializada recebe a ligação SQL Server estabelecida na inicialização. Quando todas as referências nas interfaces do objeto de sessão são libertadas, a ligação à instância do SQL Server fica disponível para outro objeto de sessão criado na fonte de dados.

Um objeto de sessão adicional criado na fonte de dados estabelece a sua própria ligação à instância do SQL Server conforme especificado pela fonte de dados. A ligação à instância do SQL Server é interrompida quando a aplicação liberta todas as referências a objetos criados nessa sessão.

O exemplo seguinte demonstra como usar o Driver OLE DB para SQL Server para se ligar a uma base de dados 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_MSOLEDBSQL, 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);  
}  

Ligar o OLE DB Driver para objetos de sessão do SQL Server a uma instância do SQL Server pode gerar uma sobrecarga significativa para aplicações que criam e libertam continuamente objetos de sessão. A sobrecarga pode ser minimizada gerindo eficientemente os objetos de sessão do OLE DB Driver para SQL Server. O Driver OLE DB para aplicações SQL Server pode manter a ligação SQL Server de um objeto de sessão ativa, mantendo uma referência em pelo menos uma interface do objeto.

Por exemplo, manter um pool de referências de objetos de criação de comandos mantém ligações ativas para esses objetos de sessão no pool. Como são necessários objetos de sessão, o código de manutenção do pool passa um ponteiro válido da interface IDBCreateCommand para o método de aplicação que requer a sessão. Quando o método de aplicação já não requer a sessão, o método devolve o ponteiro da interface ao código de manutenção do pool em vez de libertar a referência da aplicação ao objeto de criação de comandos.

Observação

No exemplo anterior, a interface IDBCreateCommand é usada porque a interface ICommand implementa o método GetDBSession , o único método no âmbito de comandos ou de linhas que permite a um objeto determinar a sessão em que foi criado. Assim, um objeto de comando, e apenas um objeto de comando, permite a uma aplicação recuperar um ponteiro de objeto fonte de dados a partir do qual podem ser criadas sessões adicionais.

Ver também

Objetos de Fonte de Dados (OLE DB)