Udostępnij za pośrednictwem


Metody konsumenta generowane przez kreatora

Kreator konsumenta OLE DB ATL nie jest dostępny w programie Visual Studio 2019 i nowszych wersjach. Nadal można dodać funkcjonalność ręcznie.

Kreator konsumentów OLE DB ATL i Kreator aplikacji MFC generują pewne funkcje, z których należy pamiętać. Niektóre metody są implementowane inaczej w projektach przypisanych, więc istnieje kilka zastrzeżeń; każdy przypadek jest opisany poniżej. Aby uzyskać informacje na temat wyświetlania wprowadzonego kodu, zobacz Debugowanie wprowadzonego kodu.

  • OpenAll Otwiera źródło danych, zestawy wierszy i włącza zakładki, jeśli są dostępne.

  • CloseAll Zamyka wszystkie otwarte zestawy wierszy i zwalnia wszystkie wykonania poleceń.

  • OpenRowset element jest wywoływany przez OpenAll program w celu otwarcia zestawu wierszy lub zestawów wierszy odbiorcy.

  • GetRowsetProperties pobiera wskaźnik do zestawu właściwości zestawu wierszy, z którymi można ustawić właściwości.

  • OpenDataSource Otwiera źródło danych przy użyciu ciągu inicjowania określonego w oknie dialogowym Właściwości łącza danych.

  • CloseDataSource zamyka źródło danych w odpowiedni sposób.

OpenAll i CloseAll

HRESULT OpenAll();

void CloseAll();

W poniższym przykładzie pokazano, jak można wywołać OpenAll polecenie i CloseAll po wielokrotnym wykonaniu tego samego polecenia. Porównaj przykładowy kod w pliku CCommand::Close, który pokazuje odmianę, która wywołuje Close metodę i ReleaseCommand zamiast CloseAll.

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

Uwagi

Jeśli zdefiniujesz metodęHasBookmark, kod ustawia DBPROP_IRowsetLocate właściwość . Upewnij się, OpenAll że robisz to tylko wtedy, gdy dostawca obsługuje tę właściwość.

OpenRowset

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

OpenAll wywołuje tę metodę, aby otworzyć zestaw wierszy lub zestawy wierszy w odbiorcy. Zazwyczaj nie trzeba wywoływać OpenRowset , chyba że chcesz pracować z wieloma źródłami danych/sesjami/zestawami wierszy. OpenRowset jest zadeklarowany w pliku nagłówka klasy polecenia lub tabeli:

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

Atrybuty implementują tę metodę inaczej. Ta wersja przyjmuje obiekt sesji i ciąg polecenia, który domyślnie jest ciągiem polecenia określonym w db_command, chociaż można przekazać inny. Jeśli zdefiniujesz metodęHasBookmark, kod ustawia DBPROP_IRowsetLocate właściwość . Upewnij się, OpenRowset że robisz to tylko wtedy, gdy dostawca obsługuje tę właściwość.

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

Ta metoda pobiera wskaźnik do zestawu właściwości zestawu wierszy; Możesz użyć tego wskaźnika, aby ustawić właściwości, takie jak DBPROP_IRowsetChange. GetRowsetProperties jest używany w klasie rekordów użytkownika w następujący sposób. Możesz zmodyfikować ten kod, aby ustawić dodatkowe właściwości zestawu wierszy:

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

Uwagi

Nie należy definiować metody globalnej GetRowsetProperties , ponieważ może ona powodować konflikt z tą zdefiniowaną przez kreatora. Jest to metoda wygenerowana przez kreatora, która jest pobierana z szablonami i przypisanymi projektami; atrybuty nie wstrzykiwają tego kodu.

OpenDataSource i CloseDataSource

HRESULT OpenDataSource();

void CloseDataSource();

Uwagi

Kreator definiuje metody OpenDataSource i CloseDataSourceOpenDataSource ; wywołuje metodę CDataSource::OpenFromInitializationString.

Zobacz też

Tworzenie konsumenta OLE DB przy użyciu kreatora