Compartilhar via


Lendo cadeias de caracteres no provedor de banco de dados OLE

A função CCustomRowset::Execute abre um arquivo e lê cadeias de caracteres. O consumidor passa o nome do arquivo para o provedor chamando ICommandText::SetCommandText. O provedor recebe o nome do arquivo e o armazena na variável de membro m_strCommandText. Execute lê o nome do arquivo de m_strCommandText. Se o nome do arquivo for inválido ou o arquivo não estiver disponível, Execute retornará um erro. Caso contrário, ele abrirá o arquivo e chamará fgets para recuperar as cadeias de caracteres. Para cada conjunto de cadeias de caracteres que ele lê, Execute cria uma instância do registro do usuário (CCustomWindowsFile modificado do Armazenamento de Cadeias de Caracteres no Provedor OLE DB) e o coloca em uma matriz.

Se o arquivo não puder ser aberto, Execute precisará retornar DB_E_NOTABLE. Se ele retornar E_FAIL, o provedor não trabalhará com muitos consumidores e não passará nos testes de conformidade do OLE DB.

Exemplo

/////////////////////////////////////////////////////////////////////////
// CustomRS.h
class CCustomRowset : public CRowsetImpl< CCustomRowset, CCustomWindowsFile, CCustomCommand>
{
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;

        ObjectLock lock(this);

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

        // Open the file
        _tcscpy_s(szFile, sizeOfFile, m_strCommandText);
        if (szFile[0] == _T('\0') ||
            (fopen_s(&pFile, (char*)&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((char*)szString, sizeOfBuffer, pFile) != NULL)
        {
            nLength = strnlen((char*)szString, sizeOfBuffer);
            szString[nLength-1] = '\0';   // Strip off trailing CR/LF
            CCustomWindowsFile am;
            _tcscpy_s(am.szCommand, am.iSize, szString);
            _tcscpy_s(am.szCommand2, am.iSize, szString);

            if (fgets((char*)szString, sizeOfBuffer, pFile) != NULL)
            {
                nLength = strnlen((char*)szString, sizeOfBuffer);
                szString[nLength-1] = '\0'; // Strip off trailing CR/LF
                _tcscpy_s(am.szText, am.iSize, szString);
                _tcscpy_s(am.szText2, am.iSize, 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;
    }
};

Quando isso for feito, seu provedor deverá estar pronto para compilar e executar. Para testar o provedor, você precisa de um consumidor com a funcionalidade correspondente. Implementar um consumidor simples mostra como criar esse consumidor de teste. Execute o consumidor de teste com o provedor e verifique se o consumidor de teste recupera as cadeias de caracteres adequadas do provedor.

Após testar com êxito seu provedor, talvez você queira aprimorar a funcionalidade dele implementando interfaces adicionais. Um exemplo é mostrado em Aprimorando o provedor somente leitura simples.

Confira também

Implementando o provedor somente leitura simples