次の方法で共有


コンシューマー ウィザードで生成されたメソッド

ATL OLE DB コンシューマー ウィザードおよび MFC アプリケーション ウィザードでは、注意する必要のある関数がいくつか生成されます。一部のメソッドは、属性を使用するプロジェクトでの実装方法が異なります。それぞれの場合の注意事項を以下に示します。挿入されたコードの表示については、「挿入されたコードのデバッグ」を参照してください。

  • OpenAll は、データ ソースや行セットを開き、ブックマークが使用可能な場合はブックマークを有効にします。

  • CloseAll は、開いている行セットをすべて閉じ、コマンドの実行をすべて解放します。

  • OpenRowset は、コンシューマーの行セット (1 つまたは複数) を開くために OpenAll によって呼び出されます。

  • GetRowsetProperties は、行セットのプロパティ セットへのポインターを取得します。このポインターを使用してプロパティを設定できます。

  • OpenDataSource は、[データ リンク プロパティ] ダイアログ ボックスで指定した初期化文字列を使用してデータ ソースを開きます。

  • CloseDataSource は、適切な方法でデータ ソースを閉じます。

OpenAll と CloseAll

HRESULT OpenAll(); 
void CloseAll();

同じコマンドを繰り返し実行するときに OpenAll と CloseAll を呼び出す方法を以下に示します。CCommand::Close のコード例と比較してください。CloseAll の代わりに CloseReleaseCommand を呼び出す方法が示されています。

int main(int argc, char* argv[])
{
   HRESULT hr;

   hr = CoInitialize(NULL);

   CCustOrdersDetail rs;      // Your CCommand-derived class
   rs.m_OrderID = 10248;      // Open order 10248
   hr = rs.OpenAll();         // (Open also executes the command)
   hr = rs.MoveFirst();         // Move to the first row and print it
   printf( "Name: %s, Unit Price: %d, Quantity: %d, Discount %d, Extended Price %d\n", rs.m_ProductName, rs.m_UnitPrice.int64, rs.m_Quantity, rs.m_Discount, rs.m_ExtendedPrice.int64 );

   // Close the first command execution
   rs.Close();


   rs.m_OrderID = 10249;      // Open order 10249 (a new order)
   hr = rs.Open();            // (Open also executes the command)
   hr = rs.MoveFirst();         // Move to the first row and print it
   printf( "Name: %s, Unit Price: %d, Quantity: %d, Discount %d, Extended Price %d\n", rs.m_ProductName, rs.m_UnitPrice.int64, rs.m_Quantity, rs.m_Discount, rs.m_ExtendedPrice.int64 );

   // Close the second command execution;
   // Instead of rs.CloseAll() you could call
   // rs.Close() and rs.ReleaseCommand():
   rs.CloseAll();

   CoUninitialize();
   return 0;
}

解説

HasBookmark メソッドを定義すると、OpenAll コードによって DBPROP_IRowsetLocate プロパティが設定されます。プロバイダーでこのプロパティがサポートされている場合にのみ、このメソッドを定義してください。

OpenRowset

// OLE DB Template version: 
HRESULT OpenRowset(DBPROPSET* pPropSet = NULL)
// Attribute-injected version:
HRESULT OpenRowset(const CSession& session, LPCWSTR szCommand = NULL);

OpenAll はこのメソッドを呼び出して、コンシューマーの行セット (1 つまたは複数) を開きます。通常、複数のデータ ソース、セッション、または行セットを使用しない限り、OpenRowset を呼び出す必要はありません。OpenRowset は、コマンドまたはテーブル クラスのヘッダー ファイルで宣言されます。

// OLE DB Template version:
HRESULT OpenRowset(DBPROPSET *pPropSet = NULL)
{
   HRESULT hr = Open(m_session, NULL, pPropSet);
   #ifdef _DEBUG
   if(FAILED(hr))
      AtlTraceErrorRecords(hr);
   #endif
   return hr;
}

属性を使用すると、このメソッドの実装方法が異なります。このバージョンでは、セッション オブジェクトとコマンド文字列が使用されます。既定では、db_command で指定されたコマンド文字列が使用されますが、別の文字列を渡すこともできます。HasBookmark メソッドを定義すると、OpenRowset コードによって DBPROP_IRowsetLocate プロパティが設定されます。プロバイダーでこのプロパティがサポートされている場合にのみ、このメソッドを定義してください。

// Attribute-injected version:
HRESULT OpenRowset(const CSession& session, LPCWSTR szCommand=NULL)
{

   DBPROPSET *pPropSet = NULL;
   CDBPropSet propset(DBPROPSET_ROWSET);
   __if_exists(HasBookmark)

   {
      propset.AddProperty(DBPROP_IRowsetLocate, true);
      pPropSet= &propset;
      }
...
}

GetRowsetProperties

void GetRowsetProperties(CDBPropSet* pPropSet);

このメソッドは、行セットのプロパティ セットへのポインターを取得します。このポインターを使用すると、DBPROP_IRowsetChange などのプロパティを設定できます。GetRowsetProperties は、次のようにユーザー レコード クラスで使用されます。このコードを変更して、ほかの行セット プロパティを設定できます。

void GetRowsetProperties(CDBPropSet* pPropSet)
{
   pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
   pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
   pPropSet->AddProperty(DBPROP_IRowsetChange, true, DBPROPOPTIONS_OPTIONAL);
   pPropSet->AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
}

解説

ウィザードによって定義されたメソッドと矛盾する場合があるため、グローバル メソッド GetRowsetProperties は定義しないでください。テンプレートおよび属性を使用するプロジェクトで取得するウィザード生成メソッドであることに注意してください。このコードは属性によって挿入されません。

OpenDataSource と CloseDataSource

HRESULT OpenDataSource(); 
void CloseDataSource();

解説

ウィザードによって OpenDataSource メソッドと CloseDataSource メソッドが定義されます。OpenDataSource は CDataSource::OpenFromInitializationString を呼び出します。

参照

概念

ウィザードを使用した OLE DB コンシューマーの作成