Методы, создаваемые мастером объекта-получателя
Мастер объекта-получателя ATL OLE DB и мастер приложений MFC создают определенные функции, на которые следует обратить внимание. Oбратите внимание, что некоторые методы в проектах с атрибутами реализуются иначе. Ниже описаны все случаи. Дополнительные сведения о просмотре введенного кода см. в разделе Отладка введенного кода.
OpenAll открывает источник данных, наборы строк и включает закладки (если они доступны).
CloseAll закрывает все открытые наборы строк и прекращает выполнение всех команд.
OpenRowset вызывается методом OpenAll для открытия набора или наборов строк объекта-получателя.
GetRowsetProperties извлекает указатель набора свойств набора строк, с помощью которого могут быть заданы свойства.
OpenDataSource открывает источник данных, использующий строку инициализации, которая указана в диалоговом окне Свойства связи с данными.
CloseDataSource закрывает источник данных соответствующим способом.
OpenAll и CloseAll
HRESULT OpenAll();
void CloseAll();
В следующем примере показано, как можно вызвать методы OpenAll и CloseAll при повторном выполнении одной и той же команды. Сравните с образцом кода в статье CCommand::Close, в котором показан вариант вызова команд Close и ReleaseCommand вместо 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;
}
Примечания
Обратите внимание: при определении метода 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 вызывает данный метод для открытия набора или наборов строк в объекте-получателе. Обычно вызывать метод 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.