Чтение строк в поставщике OLE DB

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

Index