Zaman uyumsuz işlemler gerçekleştirme
SQL Server zaman uyumsuz bir veritabanı işlemlerini gerçekleştirmek uygulamalar'ı verir.Zaman uyumsuz işlem hemen arama iş parçacığı parçacığında engellenmeden dönmek yöntemleri sağlar.Daha fazla güç ve esneklik, böylece birden çok iş parçacığı oluşturma, açıkça iş parçacığı oluşturabilir veya eşitleme işlemek geliştirici gerektirmeden.Veritabanı bağlantısı başlatılıyor veya bir komutun yürütülmesi sonucu başlatılıyor zaman uyumsuz işlem uygulamaları isteyin.
Açma ve bir veritabanı bağlantısı'nı kapatma
Kullanırken SQL Server Yerel istemci OLE DB sağlayıcı, bir veri başlatmak için tasarlanmış uygulamalar kaynak nesne zaman uyumsuz arama için önce DBPROP_INIT_ASYNCH özelliğinde bit DBPROPVAL_ASYNCH_INITIALIZE küme IDBInitialize::Initialize.Bu özellik olduğunda küme, sağlayıcı hemen çaðrý verir Başlatılamıyor S_OK işlemi hemen tamamlanmışsa, veya DB_S_ASYNCHRONOUS, zaman uyumsuz olarak başlatma devam etmektedir.Applications can query for the IDBAsynchStatus or ISSAsynchStatusinterface on the data source object, and then call IDBAsynchStatus::GetStatus orISSAsynchStatus::WaitForAsynchCompletion to get the status of the initialization.
Buna ek olarak, DBPROPSET_SQLSERVERROWSET özellik kümesine SSPROP_ISSAsynchStatus özelliği eklendi.Destekleyen sağlayıcılar ISSAsynchStatus arabirim, bu özelliğin değeri VARIANT_TRUE uygulamalıdır.
IDBAsynchStatus::Abort or ISSAsynchStatus::Abort zaman uyumsuz olarak iptal etmek için çağrılabilir:Başlatılamıyor çağrısı.Tüketici, zaman uyumsuz veri kaynak başlatma açıkça istemesi gerekir.Aksi halde, IDBInitialize::Initialize kadar veri döndürmüyor kaynak nesne tamamen başlatıldı.
Not
Bağlantı havuzu oluşturma için kullanılan veri kaynağı nesneleri çağrılamıyor ISSAsynchStatus arabirimSQL Server Yerel istemci OLE DB sağlayıcı. The ISSAsynchStatus arabirim is not exposed for pooled data kaynak objects.
Varsa, bir uygulamanın açık imleç altyapısı kullanımını zorlar. IOpenRowset::OpenRowset and IMultipleResults::GetResult zaman uyumsuz işlemi desteklemiyor.
Buna ek olarak, MDAC 2.8) olarak (Uzak proxy/stub dll çağrılamıyor ISSAsynchStatus arabirimindeSQL Server Yerel istemci. The ISSAsynchStatus arabirim is not exposed through remoting.
hizmet bileşenlerini desteklemiyor. ISSAsynchStatus.
Yürütme ve satır kümesi başlatma
Zaman uyumsuz olarak bir komutun yürütülmesi sonucu'ni açmak için tasarlanmış olan uygulamalar için küme the DBPROPVAL_ASYNCH_INITIALIZE DBPROP_ROWküme_ASYNCH özelliğinde bit.Ne zaman küme ting bu önce arama bit IDBInitialize::Initialize, ICommand::yürütmek, IOpenRowküme::OpenRow küme or IMultipleResults::GetResult, the riid bağımsız değişken olmalıdır küme IID_IDBAsynchStatus, IID_ISSAsynchStatus veya IID_IUnknown.
Yöntem hemen ile S_OK döndürür satır küme başlatma hemen veya DB_S_ASYNCHRONOUS tamamlar satır küme zaman uyumsuz olarak, başlatma devam ile ppRowset küme satırdaki istenen arabirimi küme. Için SQL Server Bu arabirim yalnızca özgün istemci OLE DB sağlayıcı olabilir IDBAsynchStatus or ISSAsynchStatus.satır kümesi kümesi tam olarak başlatılmış kadar bu arabirim, bir askıya alınmış durumu ve arama gibi davranır Queryınterface dışındaki arabirimlerIID_IDBAsynchStatus or IID_ISSAsynchStatus E_NOINTERFACE döndürebilir.Tüketici açıkça bir zaman uyumsuz işlem istemedikçe, satır kümesi kümesi eşzamanlı olarak başlatılır.Tüm istenen arabirimlerinde kullanılabilir IDBAsynchStaus::GetStatus or ISSAsynchStatus::WaitForAsynchCompletion zaman uyumsuz işlem tamamlandıktan göstergesi ile döndürür.Bu mutlaka satır kümesi, tam olarak doldurulur, ancak tam ve tamamen işlevsel olduğu anlamına gelmez.
Yürütülen komut satır kümesi döndürmezse, yine de hemen destekleyen bir nesne döndürür IDBAsynchStatus.
Zaman uyumsuz komut yürütme birden çok sonuçlar almak gerekiyorsa, aşağıdakileri yapmalısınız:
Komutu yürütmeden önce DBPROP_ROWSET_ASYNCH özelliğinin DBPROPVAL_ASYNCH_INITIALIZE kill bitini ayarlayın.
Arama ICommand::yürütmekve isteğiIMultipleResults.
The IDBAsynchStatus and ISSAsynchStatus interfaces can then be obtained by querying the multiple sonuçlar arabirim using QueryInterface.
Komut yürütülürken, ne zaman tamamladı IMultipleResults, normal, zaman uyumlu durum alanından bir özel durum olarak kullanılabilir: DB_S_ASYNCHRONOUS, içinde hangi durum döndürülebilirIDBAsynchStatus or ISSAsynchStatus işlemi tamamlandığında belirlemek için kullanılır.
Örnekler
Aşağıdaki örnekte, uygulama engellenmeyen yöntem çağırır, başka bir işlem yapar ve sonuçlar işleme geri döndürür.ISSAsynchStatus::WaitForAsynchCompletion , saat uyumsuz olarak yürütülen işlem yapılır kadar iç olay nesnesi veya tarafından belirtilen bir saat beklerdwMilisecTimeOut geçirilir.
// 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 veya iç olay nesnesi, zaman uyumsuz olarak yürütülen işlem yapılır kadar bekler.dwMilisecTimeOut değer geçirildi.
Aşağıdaki örnekte, zaman uyumsuz işlem ile birden çok sonuç kümesi gösterilmektedir:
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();
}
}
Istemci engellenmesini önlemek için , aşağıdaki örnekte olduğu gibi çalışır, zaman uyumsuz bir işlem durumunu denetleyebilirsiniz:
// 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();
}
Şu anda çalışan zaman uyumsuz işlemi iptal etmek, aşağıdaki örnekte gösterilmiştir:
// 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);
}
See Also