Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-databas i Microsoft Fabric
En OLE DB-drivrutin för SQL Server-session representerar en enda anslutning till en instans av SQL Server.
OLE DB-drivrutinen för SQL Server kräver att sessioner avgränsar transaktionsutrymme för en datakälla. Alla kommandoobjekt skapade från ett specifikt sessionsobjekt deltar i den lokala eller distribuerade transaktionen av sessionsobjektet.
Det första sessionsobjektet som skapas på den initierade datakällan får SQL Server-anslutningen som upprättas vid initieringen. När alla referenser på gränssnitten för sessionsobjektet släpps blir anslutningen till SQL Server-instansen tillgänglig för ett annat sessionsobjekt som skapats på datakällan.
Ett ytterligare sessionsobjekt som skapas på datakällan etablerar sin egen anslutning till SQL Server-instansen enligt datakällans specificering. Anslutningen till SQL Server-instansen bryts när applikationen släpper alla referenser till objekt som skapats i den sessionen.
Följande exempel visar hur man använder OLE DB-drivrutinen för SQL Server för att ansluta till en SQL Server-databas:
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);
}
Att koppla OLE DB-drivrutinen för SQL Server-sessionsobjekt till en instans av SQL Server kan generera betydande överhead för applikationer som kontinuerligt skapar och släpper sessionsobjekt. Överheaden kan minimeras genom att effektivt hantera OLE DB-drivrutinen för SQL Server-sessionsobjekt. OLE DB-drivrutin för SQL Server-applikationer kan hålla SQL Server-anslutningen till ett sessionsobjekt aktiv genom att upprätthålla en referens på minst ett gränssnitt till objektet.
Till exempel håller underhåll av en pool av kommandoskapandeobjektreferenser aktiva anslutningar för dessa sessionsobjekt i poolen. Eftersom sessionsobjekt krävs, skickar poolens underhållskod en giltig IDBCreateCommand-gränssnittspekare till applikationsmetoden som kräver sessionen. När applikationsmetoden inte längre kräver sessionen, returnerar metoden gränssnittspekaren tillbaka till poolunderhållskoden istället för att släppa applikationens referens till kommandoskapandeobjektet.
Anmärkning
I det föregående exemplet används IDBCreateCommand-gränssnittet eftersom ICommand-gränssnittet implementerar GetDBSession-metoden , den enda metoden i kommando- eller raduppsättningsområde som tillåter ett objekt att bestämma den session det skapades på. Därför tillåter ett kommandoobjekt, och endast ett kommandoobjekt, en applikation att hämta en pekare för datakällsobjekt från vilken ytterligare sessioner kan skapas.