Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform Systeem (PDW)
SQL-database in Microsoft Fabric
OLE DB-stuurprogramma downloaden
SQL Server stelt applicaties in staat asynchrone databasebewerkingen uit te voeren. Asynchrone verwerking maakt het mogelijk dat methoden onmiddellijk terugkeren zonder blokkering op de aanroepende thread. Dit biedt veel van de kracht en flexibiliteit van multithreading, zonder dat de ontwikkelaar expliciet threads hoeft te maken of synchronisatie hoeft te regelen. Applicaties vragen om asynchrone verwerking bij het initialiseren van een databaseverbinding, of bij het initialiseren van het resultaat van de uitvoering van een commando.
Een databaseverbinding openen en sluiten
Bij gebruik van de OLE DB-driver voor SQL Server kunnen applicaties die een databronobject asynchroon initiëren het DBPROPVAL_ASYNCH_INITIALIZE bit in de DBPROP_INIT_ASYNCH-eigenschap instellen voordat IDBInitialize::Initialize wordt aanroepen. Wanneer deze eigenschap is ingesteld, keert de provider onmiddellijk terug van de aanroep om te initialiseren met ofwel S_OK, als de bewerking onmiddellijk is voltooid, of DB_S_ASYNCHRONOUS, als de initialisatie asynchroon doorgaat. Applicaties kunnen de IDBAsynchStatus- of ISSAsynchStatus-interface op het databronobject opvragen en vervolgens IDBAsynchStatus::GetStatus of ISSAsynchStatus::WaitForAsynchCompletion aanroepen om de status van de initialisatie te verkrijgen.
Daarnaast is de SSPROP_ISSAsynchStatus-eigenschap toegevoegd aan de set van de DBPROPSET_SQLSERVERROWSET-eigenschappen. Providers die de ISSAsynchStatus-interface ondersteunen, moeten deze eigenschap implementeren met een waarde van VARIANT_TRUE.
IDBAsynchStatus::Abort of ISSAsynchStatus::Abort kan worden aangeroepen om de asynchrone Initialiseer-aanroep te annuleren. De consument moet expliciet Asynchronous Data Source Initialization aanvragen. Anders keert IDBInitialize::Initialize pas terug nadat het databronobject volledig is geïnitialiseerd.
Opmerking
Databronobjecten die worden gebruikt voor connection pooling kunnen de ISSAsynchStatus-interface niet aanroepen in de OLE DB-driver voor SQL Server. De ISSAsynchStatus-interface is niet blootgesteld voor gepoolde databronobjecten.
Als een applicatie expliciet het gebruik van de cursorengine afdwingt, ondersteunen IOpenRowset::OpenRowset en IMultipleResults::GetResult geen asynchrone verwerking.
Daarnaast kan de remoting proxy/stub dll (in MDAC 2.8) de ISSAsynchStatus-interface niet aanroepen in OLE DB Driver voor SQL Server. De ISSAsynchStatus-interface wordt niet blootgesteld via afstandsbeheer.
Service Components ondersteunen ISSAsynchStatus niet.
Uitvoering en Rowset-initialisatie
Applicaties die ontworpen zijn om het resultaat van de uitvoering van een commando asynchroon te openen, kunnen de DBPROPVAL_ASYNCH_INITIALIZE bit in de eigenschap DBPROP_ROWSET_ASYNCH instellen. Wanneer je deze bit instelt voordat je IDBInitialize::Initialize, ICommand::Execute, IOpenRowset::OpenRowset of IMultipleResults::GetResult aanroept, moet het riid-argument worden ingesteld op IID_IDBAsynchStatus, IID_ISSAsynchStatus of IID_IUnknown.
De methode keert onmiddellijk terug met S_OK als de initialisatie van de rijset onmiddellijk wordt voltooid, of met DB_S_ASYNCHRONOUS als de rijset asynchroon blijft initiëren, met ppRowset ingesteld op de gevraagde interface op de rijset. Voor de OLE DB-driver voor SQL Server kan deze interface alleen IDBAsynchStatus of ISSAsynchStatus zijn. Totdat de rijset volledig is geïnitialiseerd, gedraagt deze interface zich alsof hij in een onderbroken toestand is, en het aanroepen van QueryInterface voor interfaces anders dan IID_IDBAsynchStatus of IID_ISSAsynchStatus kan E_NOINTERFACE teruggeven. Tenzij de consument expliciet asynchrone verwerking aanvraagt, wordt de rowset synchroon geïnitialiseerd. Alle gevraagde interfaces zijn beschikbaar wanneer IDBAsynchStatus::GetStatus of ISSAsynchStatus::WaitForAsynchCompletion terugkeert met de indicatie dat de asynchrone operatie voltooid is. Dit betekent niet noodzakelijk dat de rowset volledig gevuld is, maar het is wel compleet en volledig functioneel.
Als het uitgevoerde commando geen rowset teruggeeft, geeft het toch direct een object dat IDBAsynchStatus ondersteunt.
Als je meerdere resultaten wilt krijgen uit asynchrone commando-uitvoering, moet je:
Stel het DBPROPVAL_ASYNCH_INITIALIZE bit van de DBPROP_ROWSET_ASYNCH-eigenschap in voordat het commando wordt uitgevoerd.
Roep ICommand::Execute op en vraag IMultipleResults op.
De IDBAsynchStatus- en ISSAsynchStatus-interfaces kunnen vervolgens worden verkregen door de multiple results-interface te bevragen met QueryInterface.
Wanneer het commando is uitgevoerd, kan IMultipleResults zoals normaal worden gebruikt, met één uitzondering uit het synchroongeval: DB_S_ASYNCHRONOUS kan worden teruggegeven, in welk geval IDBAsynchStatus of ISSAsynchStatus kan worden gebruikt om te bepalen wanneer de bewerking voltooid is.
Voorbeelden
In het volgende voorbeeld roept de applicatie een niet-blokkerende methode aan, voert andere verwerking uit en keert vervolgens terug om de resultaten te verwerken. ISSAsynchStatus::WaitForAsynchCompletion wacht op het interne gebeurtenisobject totdat de asynchroon uitvoerende operatie is voltooid of de door dwMilisecTimeOut gespecificeerde tijd is doorgegeven.
// Set the DBPROPVAL_ASYNCH_INITIALIZE bit in the
// DBPROP_ROWSET_ASYNCH property before calling Execute().
DBPROPSET CmdPropset[1];
DBPROP CmdProperties[1];
CmdPropset[0].rgProperties = CmdProperties;
CmdPropset[0].cProperties = 1;
CmdPropset[0].guidPropertySet = DBPROPSET_ROWSET;
// Set asynch mode for command.
CmdProperties[0].dwPropertyID = DBPROP_ROWSET_ASYNCH;
CmdProperties[0].vValue.vt = VT_I4;
CmdProperties[0].vValue.lVal = DBPROPVAL_ASYNCH_INITIALIZE;
CmdProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED;
hr = pICommandProps->SetProperties(1, CmdPropset);
hr = pICommand->Execute(
pUnkOuter,
IID_ISSAsynchStatus,
pParams,
pcRowsAffected,
(IUnknown**)&pISSAsynchStatus);
if (hr == DB_S_ASYNCHRONOUS)
{
// Do some work here...
hr = pISSAsynchStatus->WaitForAsynchCompletion(dwMilisecTimeOut);
if ( hr == S_OK)
{
hr = pISSAsynchStatus->QueryInterface(IID_IRowset, (void**)&pRowset);
pISSAsynchStatus->Release();
}
}
ISSAsynchStatus::WaitForAsynchCompletion wacht op het interne eventobject totdat de asynchroon uitvoerende operatie is voltooid of de dwMilisecTimeOut-waarde wordt doorgegeven.
Het volgende voorbeeld toont asynchrone verwerking met meerdere resultaatsets:
DBPROP CmdProperties[1];
// Set asynch mode for command.
CmdProperties[0].dwPropertyID = DBPROP_ROWSET_ASYNCH;
CmdProperties[0].vValue.vt = VT_I4;
CmdProperties[0].vValue.lVal = DBPROPVAL_ASYNCH_INITIALIZE;
hr = pICommand->Execute(
pUnkOuter,
IID_IMultipleResults,
pParams,
pcRowsAffected,
(IUnknown**)&pIMultipleResults);
// Use GetResults for ISSAsynchStatus.
hr = pIMultipleResults->GetResult(IID_ISSAsynchStatus, (void **) &pISSAsynchStatus);
if (hr == DB_S_ASYNCHRONOUS)
{
// Do some work here...
hr = pISSAsynchStatus->WaitForAsynchCompletion(dwMilisecTimeOut);
if (hr == S_OK)
{
hr = pISSAsynchStatus->QueryInterface(IID_IRowset, (void**)&pRowset);
pISSAsynchStatus->Release();
}
}
Om blokkering te voorkomen, kan de client de status van een lopende asynchrone bewerking controleren, zoals in het volgende voorbeeld:
// Set the DBPROPVAL_ASYNCH_INITIALIZE bit in the
// DBPROP_ROWSET_ASYNCH property before calling Execute().
hr = pICommand->Execute(
pUnkOuter,
IID_ISSAsynchStatus,
pParams,
pcRowsAffected,
(IUnknown**)&pISSAsynchStatus);
if (hr == DB_S_ASYNCHRONOUS)
{
do{
// Do some work...
hr = pISSAsynchStatus->GetStatus(DB_NULL_HCHAPTER, DBASYNCHOP_OPEN, NULL, NULL, &ulAsynchPhase, NULL);
}while (DBASYNCHPHASE_COMPLETE != ulAsynchPhase)
if SUCCEEDED(hr)
{
hr = pISSAsynchStatus->QueryInterface(IID_IRowset, (void**)&pRowset);
}
pIDBAsynchStatus->Release();
}
Het volgende voorbeeld laat zien hoe je de momenteel draaiende asynchrone bewerking kunt annuleren:
// Set the DBPROPVAL_ASYNCH_INITIALIZE bit in the
// DBPROP_ROWSET_ASYNCH property before calling Execute().
hr = pICommand->Execute(
pUnkOuter,
IID_ISSAsynchStatus,
pParams,
pcRowsAffected,
(IUnknown**)&pISSAsynchStatus);
if (hr == DB_S_ASYNCHRONOUS)
{
// Do some work...
hr = pISSAsynchStatus->Abort(DB_NULL_HCHAPTER, DBASYNCHOP_OPEN);
}
Zie ook
OLE DB-driver voor SQL Server-functies
Eigenschappen en gedrag van rijsets
ISSAsynchStatus (OLE DB)