Reading Cadeia de caracteres into the Provider OLE DB

O RMyProviderRowset::Execute função abre um arquivo e lê seqüências 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_szCommandText . Execute lê o nome do arquivo de m_szCommandText . Se o nome do arquivo é inválido ou o arquivo não está disponível, Execute retornará um erro. Caso contrário, ele abre o arquivo e chama fgets para recuperar as seqüências de caracteres. Para cada conjunto de seqüências de caracteres lê, Execute cria uma instância de registro do usuário ( CAgentMan ) e o coloca em uma matriz.

Se o arquivo não pode ser aberto, Execute deve retornar DB_E_NOTABLE. Se ela retorna E_FAIL em vez disso, o provedor não irá funcionar com muitos consumidores e não vai passar os testes de conformidade do OOLE DB.

O editado Execute função tem esta aparência:

/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS. H
Classe RMyProviderRowset: CRowsetImpllt pública; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
público:
   
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
 USES_CONVERSION;
 ARQUIVO * pFile;
 TCHAR szString [256];
 TCHAR szFile [MAX_PATH];
 size_t nLength;
 ObjectLock Lock (this);

/ / Um nome de arquivo, passado como um texto de comando, examine o arquivo
 / / colocar dados na matriz de dados.
 se (! m_szCommandText)
 {
    ATLTRACE ("nenhum nome de arquivo especificado");
    retornar E_FAIL;
 }

/ / Abrir o arquivo
 _tcscpy (szFile, m_szCommandText);
 se (szFile [0] = = _T('\0') | | ((pFile = fopen (& szFile [0], "r")) = = NULL))
 {
    ATLTRACE ("não foi possível abrir arquivo");
    retornar DB_E_NOTABLE;
 }

/ / verificar e analisar o arquivo.  O arquivo deve conter duas seqüências de caracteres por registro
 CFiles longo = 0;
 enquanto (fgets (szString, 256, pFile)! = NULL)
 {
    nLength = strlen(szString);
    szString [nLength-1] = '\0';   / / Tira fora à direita de CR/LF
    CAgentMan estou;
    _tcscpy (am.szCommand, szString);
    _tcscpy (am.szCommand2, szString);

se (fgets (szString, 256, pFile)! = NULL)
    {
       nLength = strlen(szString);
       szString [nLength-1] = '\0';   / / Tira fora à direita de CR/LF
       _tcscpy (am.szText, szString);
       _tcscpy (am.szText2, szString);
    }

AM.dwBookmark = + + cFiles;
    se (! m_rgRowData.Add(am))
    {
       ATLTRACE ("não foi possível adicionar dados a matriz");
       fclose(PFILE);
       retornar E_FAIL;
    }
 }

se (pcRowsAffected! = NULL)
    * pcRowsAffected = cFiles;
 retornar S_OK;
}

Index