Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analitik Platform Sistemi (PDW)
Microsoft Fabric'te SQL veritabanı
OLE DB sürücüsünü indirme
SQL Server, uygulamaların asenkron veritabanı işlemlerini gerçekleştirmesine olanak tanır. Asenkron işleme, çağıran iş parçacığında engellenmeden metodların hemen geri dönmesini sağlar. Bu, geliştiricinin açıkça iş parçacıkları oluşturmasını veya senkronizasyonu yönetmesini gerektirmeden çoklu iş parçacıllığının güç ve esnekliğinin büyük bir kısmını sağlar. Uygulamalar, veritabanı bağlantısını başlatırken veya bir komutun yürütülmesinden elde edilen sonucu başlatırken asenkron işlem talep eder.
Veritabanı Bağlantısını Açmak ve Kapatmak
SQL Server için OLE DB Sürücüsü kullanılırken, bir veri kaynağı nesnesini asenkron başlatmak için tasarlanmış uygulamalar, IDBInitialize::Initialize çağırmadan önce DBPROP_INIT_ASYNCH özelliğindeki DBPROPVAL_ASYNCH_INITIALIZE biti ayarlayabilir. Bu özellik ayarlandığında, sağlayıcı işlem hemen tamamlandıysa S_OK ile Başlatma çağrısından hemen sonra geri döner; başlatma asenkron devam ediyorsa DB_S_ASYNCHRONOUS ile başlar. Uygulamalar, veri kaynağı nesnesinde IDBAsynchStatus veya ISSAsynchStatus arayüzü için sorgulayabilir ve ardından başlatmanın durumunu almak için IDBAsynchStatus::GetStatus veya ISSAsynchStatus::WaitForAsynchCompletion çağırabilir.
Ayrıca, SSPROP_ISSAsynchStatus özelliği DBPROPSET_SQLSERVERROWSET özellik setine eklenmiştir. ISSAsynchStatus arayüzünü destekleyen sağlayıcılar bu özelliği VARIANT_TRUE değeriyle uygulamalıdır.
IDBAsynchStatus::Abort veya ISSAsynchStatus::Abort çağrısı çağrılarak asenkron Başlatma çağrısını iptal edebilir. Tüketici, Asenkron Veri Kaynağı Başlatma Başlatma'yı açıkça talep etmelidir. Aksi takdirde, IDBInitialize::Initialize veri kaynağı nesnesi tamamen başlatılana kadar geri dönmez.
Uyarı
Bağlantı havuzu için kullanılan veri kaynak nesneleri, SQL Server için OLE DB Sürücüsü'nde ISSAsynchStatus arayüzünü çağıramaz. ISSAsynchStatus arayüzü, havuzlu veri kaynak nesneleri için açığa çıkmaz.
Bir uygulama açıkça imleç motorunu kullanmaya zorluyorsa, IOpenRowset::OpenRowset ve IMultipleResults::GetResult asenkron işlemi desteklemeyecektir.
Ayrıca, uzaktan yönlendirilen proxy/stub dll (MDAC 2.8 sürümünde) SQL Server için OLE DB Sürücüsü'nde ISSAsynchStatus arayüzünü çağıramaz. ISSAsynchStatus arayüzü uzaktan kumandalama yoluyla açığa çıkmaz.
Servis Bileşenleri ISSAsynchStatus'u desteklemez.
Yürütme ve Sıra Kümesi Başlatma
Bir komutun yürütülmesinden çıkan sonucu asenkron olarak açmak için tasarlanmış uygulamalar, DBPROP_ROWSET_ASYNCH özelliğindeki DBPROPVAL_ASYNCH_INITIALIZE biti ayarlayabilir. IDBInitialize::Initialize, ICommand::Execute, IOpenRowset::OpenRowset veya IMultipleResults::GetResult çağrılmadan önce bu bit ayarlandığında, riid argümanı IID_IDBAsynchStatus, IID_ISSAsynchStatus veya IID_IUnknown olarak ayarlanmalıdır.
Yöntem, satır kümesi başlatma işlemi hemen tamamlanırsa S_OK ile hemen döner; ya da satır kümesi asenkron olarak başlatmaya devam ederse DB_S_ASYNCHRONOUS ile döner; ppRowset ise satır kümesinde istenen arayüze ayarlanır. SQL Server için OLE DB Sürücüsü için bu arayüz yalnızca IDBAsynchStatus veya ISSAsynchStatus olabilir. Satır kümesi tamamen başlatılana kadar, bu arayüz askıya alınmış durumdaymış gibi davranır ve IID_IDBAsynchStatus veya IID_ISSAsynchStatus dışındaki arayüzler için QueryInterface çağrısı E_NOINTERFACE döndürebilir. Tüketici açıkça asenkron işlem talep etmedikçe, satır kümesi senkronize olarak başlatılır. IDBAsynchStatus::GetStatus veya ISSAsynchStatus::WaitForAsynchCompletion asenkron işlemin tamamlandığını gösterdiğinde istenen tüm arayüzler kullanılabilir. Bu, satır kümesinin tamamen doldurulduğu anlamına gelmez, ancak tam ve işlevseldir.
Çalıştırılan komut bir satır kümesi döndürmezse, IDBAsynchStatus'u destekleyen bir nesneyle hemen döner.
Asenkron komut yürütmesinden birden fazla sonuç almanız gerekiyorsa, şunları yapmalısınız:
Komutu çalıştırmadan önce DBPROP_ROWSET_ASYNCH özelliğinin DBPROPVAL_ASYNCH_INITIALIZE bitini ayarlayın.
ICommand::Execute'u arayın ve IMultipleResults talep edin.
IDBAsynchStatus ve ISSAsynchStatus arayüzleri, QueryInterface kullanılarak çoklu sonuç arayüzü sorgulanarak elde edilebilir.
Komut yürütülmeyi tamamladığında, IMultipleResults normal şekilde kullanılabilir, senkron durumdan bir istisna hariç: DB_S_ASYNCHRONOUS geri dönebilir; bu durumda IDBAsynchStatus veya ISSAsynchStatus kullanılarak işlemin tamamlandığını belirlemek mümkündür.
Örnekler
Aşağıdaki örnekte, uygulama engellemesiz bir yöntem çağırır, başka bir işlem yapar ve ardından sonuçları işlemek için geri döner. ISSAsynchStatus::WaitForAsynchCompletion, asenkron yürütülen işlem tamamlanana veya dwMilisecTimeOut tarafından belirtilen süre geçene kadar iç olay nesnesinde bekler.
// 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 , asenkron olarak yürütülen işlem tamamlanana veya dwMilisecTimeOut değeri geçilene kadar iç olay nesnesinde bekler.
Aşağıdaki örnek, birden fazla sonuç kümesiyle asenkron işlemeyi gösterir:
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();
}
}
Engellemeyi önlemek için, istemci aşağıdaki örnekte olduğu gibi çalışan asenkron bir işlemin durumunu kontrol edebilir:
// 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();
}
Aşağıdaki örnek, şu anda çalışan asenkron işlemi nasıl iptal edebileceğinizi göstermektedir:
// 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);
}
Ayrıca Bkz.
SQL Server Özellikleri için OLE DB Driver
Sıra Kümesi Özellikleri ve Davranışları
ISSAsynchStatus (OLE DB)