Zaman uyumsuz işlemler yapma

SQL Server zaman uyumsuz veritabanı işlemlerini gerçekleştirmek üzere uygulamaları sağlar.Zaman uyumsuz işleme iş parçacığı engelleme olmadan hemen dönmek yöntemler sağlar.Bu sayede büyük bir güç ve esnekliğini şunun açıkça iş parçacığı oluşturma veya eşitleme işlemek geliştirici gerektirmeden.Veritabanı bağlantısı başlatılırken veya komut yürütme sonuç başlatırken zaman uyumsuz işleme uygulamaları isteyin.

Açılış ve kapanış veritabanı bağlantısı

Kullanırken SQL Server yerel istemci ole db sağlayıcı, zaman uyumsuz olarak bir veri kaynak nesne başlatmak üzere tasarlanmış uygulamalar için küme DBPROPVAL_ASYNCH_INITIALIZE bit DBPROP_INIT_ASYNCH özelliği arama için önce IDBInitialize::Initialize.Bu özellik olduğunda küme, çağrıya hemen sağlayıcının döndürdüğü başlatmak hemen işlem tamamlandı, s_ok veya başlatma zaman uyumsuz olarak devam ediyor, db_s_asynchronous.Applications can query for the IDBAsynchStatus or ISSAsynchStatus interface on the data source object, and then call IDBAsynchStatus::GetStatus or ISSAsynchStatus::WaitForAsynchCompletion to get the status of the initialization.

Buna ek olarak, dbpropset_sqlserverrowset özellik küme için SSPROP_ISSAsynchStatus özelliği eklendi.Desteği sağlayıcıları ISSAsynchStatus arabirim bu özellik değeri üzerine yazılmasına uygulamalıdır.

IDBAsynchStatus::Abort veya ISSAsynchStatus::Abort adlı zaman uyumsuz iptal etmek için başlatmak çağırın.Zaman uyumsuz veri kaynağı başlatma tüketici istemenin gerekir.Aksi takdirde, IDBInitialize::Initialize kadar veri kaynak nesne tümüyle başlatılmamış döndürmez.

Not

Bağlantı havuzu oluşturma için kullanılan veri kaynak nesneleri cannot call ISSAsynchStatus , arabirim SQL Server yerel istemci ole db sağlayıcı.The ISSAsynchStatus interface is not exposed for pooled data source objects.

Bir uygulamayı açıkça imleç Altyapısı kullanılmasını zorlar, IOpenRowset::OpenRowset ve IMultipleResults::GetResult zaman uyumsuz işleme desteklemez.

Buna ek olarak, remoting proxy/stub dll (mdac 2.8) çağrılamıyor ISSAsynchStatus , arabirim SQL Server yerel istemci.The ISSAsynchStatus interface is not exposed through remoting.

Hizmeti bileşenlerini destek ISSAsynchStatus.

Yürütme ve satır kümesi başlatma

Uygulamaları sonucu bir komutun yürütülmesini zaman uyumsuz olarak açmak için tasarlanmış küme bit dbprop_row DBPROPVAL_ASYNCH_INITIALIZEküme_asynch özelliği.Zaman kümearama için önce bu bit ting IDBInitialize::Initialize, ICommand::Execute, IOpenRowküme:: OpenRowküme veya IMultipleResults::GetResult, riid bağımsız değişken olmalıdır küme IID_IDBAsynchStatus, IID_ISSAsynchStatus veya IID_IUnknown.

Satır küme zaman uyumsuz olarak, başlatma devam ederse hemen veya db_s_asynchronous ile satır küme başlatma tamamlarsa yöntem hemen ile s_ok döndürür ile ppRowset ayarlamak için istenen arabirim üzerinde satır küme.İçin SQL Server yerel istemci ole db sağlayıcı, bu arabirim yalnızca IDBAsynchStatus veya ISSAsynchStatus.Satır kümesi tam olarak başlatılmış olan kadar bu arabirim, bir bekleme durumuna ve arama gibi olsaydı davranır QueryInterface dışındaki arabirimler için IID_IDBAsynchStatus veya IID_ISSAsynchStatus E_NOINTERFACE döndürebilir.Satır kümesi tüketici açıkça zaman uyumsuz işleme istemedikçe, eş zamanlı olarak başlatıldı.Tüm istenen arabirimleri kullanılabilir ne zaman IDBAsynchStaus::GetStatus veya ISSAsynchStatus::WaitForAsynchCompletion zaman uyumsuz işlem tamamlanmadan gösterimi ile döner.Bu satır kümesi tam olarak doldurulur, ancak eksiksiz ve tam olarak işlevsel olduğu gelmez.

Yürütülen komut bir satır kümesi döndürmek, yine de hemen destekleyen bir nesne döndürür IDBAsynchStatus.

Zaman uyumsuz komut yürütme birden çok sonuçlar elde etmek gerekiyorsa, aşağıdakileri yapmalısınız:

  • Komutu yürütmeden önce dbprop_rowset_asynch özellik DBPROPVAL_ASYNCH_INITIALIZE bitini ayarlayın.

  • Call ICommand::Executeve istek IMultipleResults.

The IDBAsynchStatus and ISSAsynchStatus interfaces can then be obtained by querying the multiple results interface using QueryInterface.

Komut yürütülürken, bittiğinde, IMultipleResults ile zaman uyumlu bir özel normal olarak kullanılan durum: db_s_asynchronous döndürülmesi, içinde durum IDBAsynchStatus veya ISSAsynchStatus ne zaman işlemi tamamlanıp tamamlanmadığını belirlemek için kullanılabilir.

Örnekler

Aşağıdaki örnekte, uygulama engelleyici olmayan yöntem çağırır, başka bir işlem ve sonuçlar işlemek döndürür.ISSAsynchStatus::WaitForAsynchCompletion saat uyumsuz olarak yürütülen işlem tamamlanıncaya kadar İç olay nesnesi veya belirtilen süre bekler dwMilisecTimeOut 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 zaman uyumsuz olarak yürütülen işlem tamamlanıncaya kadar İç olay nesnesinde bekler veya dwMilisecTimeOut değeri iletilir.

Aşağıdaki örnek, birden çok sonuç kümeleri ile zaman uyumsuz işleme 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();
   }
}

Engellemesini önlemek için istemci aşağıdaki örnekte olduğu gibi çalışan 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();
}

Nasıl şu anda çalışan zaman uyumsuz işlem iptal edebilirsiniz 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);
}