Aracılığıyla paylaş


Zaman uyumsuz işlemler gerçekleştirme

SQL Serverzaman uyumsuz veritabanı işlemlerini gerçekleştirmek için uygulamaları sağlar. Zaman uyumsuz işleme hemen arama iş parçacığında engellenmeden dönmek yöntemler sağlar. Bu kadar güç ve esneklik sağlayan çoklu, geliştirici açıkça iş parçacığı oluşturma veya eşitleme işlemek için gerek kalmadan. Zaman uyumsuz işlem veritabanı bağlantısı başlatılırken veya komut yürütme sonuç başlatırken uygulamaların isteği.

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

Kullanırken SQL Serveryerel istemci ole db sağlayıcısı, veri kaynağı nesnesi uyumsuz başlatmak üzere tasarlanmış uygulamalar DBPROP_INIT_ASYNCH özelliği arama kala biraz DBPROPVAL_ASYNCH_INITIALIZE ayarlayabilirsiniz IDBInitialize::Initialize. Bu özelliği ayarlandığında, sağlayıcı hemen çağrısı verir başlatmak işlemi hemen tamamlanmışsa s_ok veya başlatma zaman uyumsuz olarak devam ediyor, db_s_asynchronous,. Uygulamalar için sorgulama yapabilen IDBAsynchStatus veya ISSAsynchStatusarabirim veri kaynağı nesnesi ve ardından arama IDBAsynchStatus::GetStatus ya ISSAsynchStatus::WaitForAsynchCompletion başlatma durumunu almak için. 

Ayrıca, SSPROP_ISSAsynchStatus özelliği dbpropset_sqlserverrowset özellik kümesi eklendi. Destekleyen sağlayıcıları ISSAsynchStatus arabirimi bu özelliği varıant_true değeri uygulamak gerekir.

IDBAsynchStatus::Abort ya ISSAsynchStatus::Abort zaman uyumsuz iptal etmek için çağrılabilir başlatmak çağırın. Tüketici açıkça uyumsuz veri kaynağı başlatma istemeniz gerekir. Aksi takdirde, IDBInitialize::Initialize kadar veri kaynağı nesnesi tamamen başlatıldı döndürmez.

[!NOT]

Bağlantı havuzu oluşturma için kullanılan veri kaynağı nesneleri can't call ISSAsynchStatus içinde arabirim SQL Serveryerel istemci ole db sağlayıcısını. ISSAsynchStatus arabirimi için havuza alınan veri kaynağı nesneleri maruz değildir.

Bir uygulamayı açıkça zorlar imleç altyapısı, kullanımı, IOpenRowset::OPENROWSET ve IMultipleResults::GetResult zaman uyumsuz işleme desteklemez.

Ayrıca, uzaktan erişim proxy/stub dll (mdac 2.8) çağrı yapamazsınız ISSAsynchStatus içinde arabirim SQL ServerNative Client. ISSAsynchStatus arabirimi uzaktan erişim maruz değildir.

Hizmeti bileşenlerini desteklemez ISSAsynchStatus.

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

Zaman uyumsuz sonuç komut yürütme açmak için tasarlanmış uygulamalar dbprop_rowset_asynch özelliğinde biraz DBPROPVAL_ASYNCH_INITIALIZE ayarlayabilirsiniz. Bu biraz arama kala ayarlarken IDBInitialize::Initialize, ICommand::Execute, IOpenRowset::OPENROWSET ya IMultipleResults::GetResult, riidbağımsız değişkeni ayarlanmalıdır, IID_IDBAsynchStatus, IID_ISSAsynchStatus veya IID_IUnknown.

Satır kümesi eşzamansız olarak başlatma devam ederse hemen veya db_s_asynchronous satır kümesi başlatma tamamlarsa yöntem hemen ile s_ok döndürür ile ppRowsetsatır kümesi istenen arabirim ayarlayın. İçin SQL Serveryerel istemci ole db sağlayıcısı, bu arabirimin yalnızca olabilir IDBAsynchStatus veya ISSAsynchStatus. Satır kümesi tam olarak başlatılmış olan kadar sanki bir askıda bekleme ve arama vardı bu arabirim davranır QueryInterface dışındaki arabirimler için IID_IDBAsynchStatus ya IID_ISSAsynchStatus E_NOINTERFACE dönebilir. Tüketici açıkça zaman uyumsuz işleme istemedikçe, satır kümesi eşzamanlı olarak başlatıldı. Tüm istenen arabirimleri kullanılabilir ne zaman IDBAsynchStaus::GetStatus ya ISSAsynchStatus::WaitForAsynchCompletion zaman uyumsuz işlem tamamlanmadan gösterimi ile döner. Bu mutlaka satır kümesi tam olarak doldurulur, ancak eksiksiz ve tam olarak işlevsel demek değildir.

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

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

  • dbprop_rowset_asynch özelliği DBPROPVAL_ASYNCH_INITIALIZE gem komutu yürütmeden önce ayarlayın.

  • Arama ICommand::Executeve istek IMultipleResults.

IDBAsynchStatus ve ISSAsynchStatus arabirimleri sonra elde edilemiyor birden çok sonuçları arabirimini kullanarak sorgulayarak QueryInterface.

Komutu yürütmeden, tamamlandığında IMultipleResults normal, bir istisna dışında eşzamanlı durumda kullanılabilir: db_s_asynchronous iade, bu durumda IDBAsynchStatus veya ISSAsynchStatus zaman işlem tamamlanmadan belirlemek için kullanılabilir.

Örnekler

Aşağıdaki örnekte, uygulama engellenmeyen bir yöntemi çağırır bazı diğer işlemleri yapar ve sonuçları işlemek döndürür. ISSAsynchStatus::WaitForAsynchCompletion zaman uyumsuz olarak yürütülen operasyonun kadar iç olay nesnesi ya da belirtilen süre bekler dwMilisecTimeOutgeç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();
   }
}

// 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 İç olay nesnesi, zaman uyumsuz olarak yürütülen operasyonun kadar bekler ya da 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();
   }
}

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 kontrol edebilirsiniz:

// 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();
}

// 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, nasıl şu anda çalışan zaman uyumsuz işlem iptal edebilirsiniz gösterir:

// 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);
}

// 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.

Başvuru

ISSAsynchStatus (ole db)

Kavramlar

Satır kümesi özellikleri ve davranışları

Diğer Kaynaklar

SQL Server yerel istemci özellikleri