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 przezOpenAll
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 CloseDataSource
OpenDataSource
; wywołuje metodę CDataSource::OpenFromInitializationString.