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 блокировку;
/ / От имени файла, переданного в качестве текста команды, сканирования файла
/ / размещения данных в массиве данных.
Если (! 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 (256, szString, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = «\0»; / / Сдирать трейлинг CR/LF
CAgentMan ам;
_tcscpy (am.szCommand, szString);
_tcscpy (am.szCommand2, szString);
Если (fgets (256, szString, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = «\0»; / / Сдирать трейлинг CR/LF
_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;
}