Udostępnij przez


Sesje

A SQL Server Sesja macierzystego dostawca klient OLE DB reprezentuje jedno połączenie z wystąpienie programu SQL Server.

The SQL Server Native klient OLE DB dostawca requires that sessions delimit transaction space for a data urządzenie źródłowe. Wszystkie polecenia obiekty utworzone na podstawie obiektu określonej sesja uczestniczyć w transakcji lokalnej lub rozproszonym obiektu sesja.

Pierwszy obiekt sesja utworzonych na zainicjować danych urządzenie źródłowe odbiera SQL Server Połączenie nawiązywane na inicjowanie. Gdy wszystkie odwołania w interfejsach sesji zwalniany jest obiekt, połączenie z wystąpienie SQL Server staje się dostępna dla innego obiektu sesja utworzona w źródle danych.

Obiekt dodatkowych sesja utworzonych w źródle danych ustanawia własne połączenia z wystąpienie SQL Server określone przez urządzenie źródłowe danych. Połączenie z wystąpienie SQL Server jest usuwane, gdy aplikacja zwalnia wszystkie odwołania do obiektów utworzonych podczas danej sesja.

W poniższym przykładzie przedstawiono sposób użycia SQL Server Macierzystego dostawca klient OLE DB do łączenia się z SQL Server Baza danych:

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);
}

Łączenie z SQL Server Macierzysta obiektów sesja klient OLE DB dostawca do wystąpienie SQL Server można wygenerować znaczne obciążenie dla aplikacji, które stale tworzenia i zwalnianie obiektów sesja. Można zminimalizować obciążenie związane przez Zarządzanie SQL Server Sesja macierzystego dostawca klient OLE DB obiektów wydajnie. SQL Server Aplikacje macierzystego dostawca klient OLE DB można zachować SQL Server połączenia aktywne przez utrzymywanie odwołanie na co najmniej jeden interfejs obiektu obiektu sesja.

Na przykład utrzymywania puli polecenie utworzenia obiektu odwołań zachowuje aktywnych połączeń dla tych obiektów sesja w puli.Gdy obiektów sesja są wymagane, kod eksploatacji puli przekazuje prawidłowy IDBCreateCommand wskaźnikiem interfejs do metoda aplikacji wymagających sesja.Gdy metoda rozliczania wymaga już sesja, metoda zwraca wartość wskaźnika interfejs do puli kod eksploatacji, a nie zwalniając aplikacji odwołanie do obiektu tworzenia polecenia.

Uwaga

W powyższym przykładzie IDBCreateCommand ponieważ używany jest interfejs ICommand implementuje interfejs GetDBSession metoda, jedyną metodą w zakresie polecenia lub zestaw wierszy, który umożliwia ustalenie, sesja, w którym został utworzony obiekt.Dlatego też obiektu polecenia, a jedynie obiektu polecenia, pozwala aplikacjom pobrać wskaźnika obiektu urządzenie źródłowe danych, z których można tworzyć dodatkowe sesje.