На RMyProviderRowset::Execute функція відкриває файл і читає рядки. Споживач проходить ім'я файлу до постачальника за номером ICommandText::SetCommandText. Постачальник отримує ім'я файлу та збереження його у змінної-члена m_szCommandText . Execute читає файл з m_szCommandText . Якщо ім'я файлу неправильне або файл недоступний, Execute повертає повідомлення про помилку. В іншому випадку, він відкриває файл і закликає fgets для отримання рядків. За кожен набір рядків вона читає, Execute створює екземпляр запис користувача ( CAgentMan ) і масив.
Якщо не вдається відкрити файл, Execute має повернути DB_E_NOTABLE. Якщо це повертає E_FAIL замість того, постачальник не буде працювати з багато споживачів і не пройде тестів відповідності OLE DB.
Сам редагований Execute функція виглядає наступним чином:
/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
клас RMyProviderRowset: Громадська CRowsetImpllt; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
готелю:
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
USES_CONVERSION;
ФАЙЛ * pFile;
TCHAR szString [256];
TCHAR szFile [MAX_PATH];
size_t nLength;
ObjectLock lock(this);
/ / Від імені файлу, як команда текст, перевірити цей файл
/ / розміщення даних у масиву даних.
Якщо (! m_szCommandText)
{
ATLTRACE ("не вказано ім'я файлу");
повернення E_FAIL;
}
/ / Відкритого файлу
_tcscpy (szFile, m_szCommandText);
Якщо (szFile [0] = = _T('\0') | | ((pFile = fopen (& szFile [0], "r")) = = NULL))
{
ATLTRACE ("не вдалося відкрити файл");
повернення DB_E_NOTABLE;
}
/ / сканування і розібрати файл. Файл має містити два рядки за рекорд
ДОВГИЙ cFiles = 0;
Хоча (fgets (szString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\0'; / / Газа від трейлінг-CR/л. Ф.
CAgentMan м;
_tcscpy (am.szCommand, szString);
_tcscpy (am.szCommand2, szString);
Якщо (fgets (szString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\0'; / / Газа від трейлінг-CR/л. Ф.
_tcscpy (am.szText, szString);
_tcscpy (am.szText2, szString);
}
AM.dwBookmark = + + cFiles;
Якщо (! m_rgRowData.Add(am))
{
ATLTRACE ("не може додати дані до масиву");
fclose(pFile);
повернення E_FAIL;
}
}
Якщо (pcRowsAffected! = NULL)
* pcRowsAffected = cFiles;
повернення S_OK;
}