Udostępnij za pośrednictwem


Wczytywanie ciągów do dostawcy OLE DB

RMyProviderRowset::Execute Funkcji otwiera plik i odczytuje ciągów.Konsumentowi przekazuje nazwę pliku do dostawcy, wywołując ICommandText::SetCommandText.Dostawca otrzymuje nazwę pliku i zapisuje ją w zmiennej Państwa m_szCommandText.Executeodczytuje nazwę pliku z m_szCommandText.Jeśli nazwa pliku jest nieprawidłowa lub plik jest niedostępny, Execute zwraca błąd.W przeciwnym wypadku zostanie otwarty plik i wywołania fgets do pobierania ciągów znaków.Każdy zestaw ciągów to odczyty, Execute tworzy instancję rekordu użytkownika (CAgentMan) i umieszcza ją w tablicy.

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

Przykład

Opis

Edytowany Execute funkcja wygląda tak:

Kod

/////////////////////////////////////////////////////////////////////////
// MyProviderRS.h
class RMyProviderRowset : public CRowsetImpl< RMyProviderRowset, CAgentMan, CRMyProviderCommand>
{
public:
    HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
    {
        enum {
            sizeOfBuffer = 256,
            sizeOfFile = MAX_PATH
        };
        USES_CONVERSION;
        FILE* pFile = NULL;
        TCHAR szString[sizeOfBuffer];
        TCHAR szFile[sizeOfFile];
        size_t nLength;        errcodeerr;

        ObjectLock lock(this);

        // From a filename, passed in as a command text, scan the file
        // placing data in the data array.
        if (!m_szCommandText)
        {
            ATLTRACE("No filename specified");
            return E_FAIL;
        }

        // Open the file
        _tcscpy_s(szFile, sizeOfFile, m_szCommandText);
        if (szFile[0] == _T('\0') || 
            ((err = fopen_s(&pFile, &szFile[0], "r")) == 0))
        {
            ATLTRACE("Could not open file");
            return DB_E_NOTABLE;
        }

        // Scan and parse the file.
        // The file should contain two strings per record
        LONG cFiles = 0;
        while (fgets(szString, sizeOfBuffer, pFile) != NULL)
        {
            nLength = strnlen(szString, sizeOfBuffer);
            szString[nLength-1] = '\0';   // Strip off trailing CR/LF
            CAgentMan am;
            _tcscpy_s(am.szCommand, am.sizeOfCommand, szString);
            _tcscpy_s(am.szCommand2, am.sizeOfCommand2, szString);

            if (fgets(szString, sizeOfBuffer, pFile) != NULL)
            {
                nLength = strnlen(szString, sizeOfBuffer);
                szString[nLength-1] = '\0'; // Strip off trailing CR/LF
                _tcscpy_s(am.szText, am.sizeOfText, szString);
                _tcscpy_s(am.szText2, am.sizeOfText2, szString);
            }

            am.dwBookmark = ++cFiles;
            if (!m_rgRowData.Add(am))
            {
                ATLTRACE("Couldn't add data to array");
                fclose(pFile);
                return E_FAIL;
            }
        }

        if (pcRowsAffected != NULL)
            *pcRowsAffected = cFiles;
        return S_OK;
    }
}

Zobacz też

Informacje

Implementowanie prostego dostawcy tylko do odczytu