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;
}