Odczyt ciągi w dostawcy bazy danych OLE

RMyProviderRowset::ExecuteFunkcja zostanie otwarty plik i odczytuje ciągi. Konsument przekazuje nazwę pliku do dostawcy przez wywołanie ICommandText::SetCommandText. Dostawca otrzymuje nazwę pliku i zapisuje ją w zmiennej członek m_szCommandText . Execute odczytuje nazwa pliku z m_szCommandText . Jeśli nazwa pliku jest nieprawidłowa lub plik jest niedostępny, Execute zwraca błąd. W przeciwnym razie otwiera plik i wywołuje fgets do pobierania ciągów. Dla każdego zestawu ciągi on odczyty, Execute tworzy instancję rekordu użytkownika ( CAgentMan ) i umieszcza go w tablicy.

Jeśli nie można otworzyć pliku, Execute musi zwracać DB_E_NOTABLE. Jeśli E_FAIL zwraca zamiast, dostawca nie będą działać z wielu konsumentów i nie przejdą testów zgodności OLE DB.

Edytowany Execute funkcja wygląda to:

/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
Klasa RMyProviderRowset: CRowsetImpllt publicznych; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
publiczne:
   
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
 USES_CONVERSION;
 PLIK * pFile;
 TCHAR szString [256];
 TCHAR szFile [MAX_PATH];
 int nLength;
 ObjectLock lock(this);

/ / Z nazwą pliku, przekazany jako tekst polecenia, skanowanie pliku
 / / umieszczania danych w tablicy danych.
 Jeżeli (! m_szCommandText)
 {
    ATLTRACE ("nie podano nazwy pliku");
    Zwraca E_FAIL;
 }

/ / Otwórz plik
 _tcscpy (szFile, m_szCommandText);
 Jeżeli (szFile [0] == _T('\0') || ((pFile = fopen (& szFile [0], "r")) == NULL))
 {
    ATLTRACE ("nie można otworzyć pliku");
    Zwraca DB_E_NOTABLE;
 }

/ / skanowania i analizować pliku.  Plik powinien zawierać dwa ciągi jednego rekordu
 LONG cFiles = 0;
 podczas gdy (fgets (szString, 256 pFile)! = NULL)
 {
    nLength = strlen(szString);
    szString [nLength-1] = '\0';   / / Strip wyłączyć końcowe CR/LF
    Jestem CAgentMan;
    _tcscpy (am.szCommand, szString);
    _tcscpy (am.szCommand2, szString);

Jeżeli (fgets (szString, 256 pFile)! = NULL)
    {
       nLength = strlen(szString);
       szString [nLength-1] = '\0';   / / Strip wyłączyć końcowe CR/LF
       _tcscpy (am.szText, szString);
       _tcscpy (am.szText2, szString);
    }

am.dwBookmark = ++ cFiles;
    Jeżeli (! m_rgRowData.Add(am))
    {
       ATLTRACE ("nie można dodawać dane do tablicy");
       fclose(pFile);
       Zwraca E_FAIL;
    }
 }

Jeżeli (pcRowsAffected! = NULL)
    * pcRowsAffected = cFiles;
 Zwraca wartość S_OK;
}

Index