Sesi (Penyedia OLE DB Klien Asli)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Penting

SQL Server Native Client (sering disingkat SNAC) telah dihapus dari SQL Server 2022 (16.x) dan SQL Server Management Studio 19 (SSMS). Penyedia SQL Server Native Client OLE DB (SQLNCLI atau SQLNCLI11) dan Penyedia Microsoft OLE DB warisan untuk SQL Server (SQLOLEDB) tidak direkomendasikan untuk pengembangan baru. Beralih ke Microsoft OLE DB Driver (MSOLEDBSQL) baru untuk SQL Server ke depannya.

Sesi penyedia SQL Server Native Client OLE DB mewakili satu koneksi ke instans SQL Server.

Penyedia SQL Server Native Client OLE DB mengharuskan sesi memisahkan ruang transaksi untuk sumber data. Semua objek perintah yang dibuat dari objek sesi tertentu berpartisipasi dalam transaksi lokal atau terdistribusi objek sesi.

Objek sesi pertama yang dibuat pada sumber data yang diinisialisasi menerima koneksi SQL Server yang dibuat pada inisialisasi. Ketika semua referensi pada antarmuka objek sesi dirilis, koneksi ke instans SQL Server menjadi tersedia untuk objek sesi lain yang dibuat pada sumber data.

Objek sesi tambahan yang dibuat pada sumber data membuat koneksinya sendiri ke instans SQL Server seperti yang ditentukan oleh sumber data. Koneksi ke instans SQL Server dihilangkan ketika aplikasi merilis semua referensi ke objek yang membuat sesi tersebut.

Contoh berikut menunjukkan cara menggunakan penyedia SQL Server Native Client OLE DB untuk menyambungkan ke database 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);  
}  

Menyambungkan objek sesi penyedia SQL Server Native Client OLE DB ke instans SQL Server dapat menghasilkan overhead yang signifikan untuk aplikasi yang terus membuat dan merilis objek sesi. Overhead dapat diminimalkan dengan mengelola objek sesi penyedia SQL Server Native Client OLE DB secara efisien. Aplikasi penyedia SQL Server Native Client OLE DB dapat menjaga koneksi SQL Server objek sesi tetap aktif dengan mempertahankan referensi pada setidaknya satu antarmuka objek.

Misalnya, mempertahankan kumpulan referensi objek pembuatan perintah menyimpan koneksi aktif untuk objek sesi tersebut di kumpulan. Karena objek sesi diperlukan, kode pemeliharaan kumpulan meneruskan penunjuk antarmuka IDBCreateCommand yang valid ke metode aplikasi yang memerlukan sesi. Ketika metode aplikasi tidak lagi memerlukan sesi, metode mengembalikan penunjuk antarmuka kembali ke kode pemeliharaan kumpulan daripada merilis referensi aplikasi ke objek pembuatan perintah.

Catatan

Dalam contoh sebelumnya, antarmuka IDBCreateCommand digunakan karena antarmuka ICommand mengimplementasikan metode GetDBSession , satu-satunya metode dalam cakupan perintah atau set baris yang memungkinkan objek untuk menentukan sesi tempatnya dibuat. Oleh karena itu, objek perintah, dan hanya objek perintah, memungkinkan aplikasi untuk mengambil penunjuk objek sumber data tempat sesi tambahan dapat dibuat.

Lihat Juga

Objek Sumber Data (OLE DB)