Читання рядки в постачальника 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 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;
}

Index