Il RMyProviderRowset::Execute funzione apre un file e legge stringhe. Il consumer passa il nome file al provider chiamando ICommandText:: SetCommandText. Il provider riceve il nome del file e lo memorizza nella variabile membro m_szCommandText . Execute legge il nome del file da m_szCommandText . Se il nome del file non è valido o non è disponibile, il file Execute restituisce un errore. In caso contrario, si apre il file e chiama fgets per recuperare le stringhe. Per ogni set di stringhe e letture, Execute crea un'istanza del Record utente ( CAgentMan ) e lo inserisce in una matrice.
Se il file non può essere aperto, Execute deve restituire DB_E_NOTABLE. Se invece restituisce E_FAIL , il provider non funzionerà con molti consumatori e non supererà i test di conformità OLE DB.
La cura Execute funzione assomiglia a questo:
/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS. H
classe RMyProviderRowset: CRowsetImpllt pubblica; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
pubblica:
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
USES_CONVERSION;
FILE * pFile;
TCHAR szString [256];
TCHAR szFile [MAX_PATH];
size_t nLength;
ObjectLock lock(this);
/ / Da un nome di file, passato come un testo di comando, scansione del file
/ / immissione dati della matrice di dati.
Se (! m_szCommandText)
{
ATLTRACE ("No nomefile specificato");
restituire E_FAIL;
}
/ / Aprire il file
tcscpy (szFile, m_szCommandText);
Se (szFile [0] = = _T('\0') | | ((pFile = fopen (& szFile [0], "r")) = = NULL))
{
ATLTRACE ("Impossibile aprire il file");
return DB_E_NOTABLE;
}
/ / scansione e analizzare il file. Il file deve contenere due stringhe per record
LONG cFiles = 0;
mentre (fgets (szString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\0'; / / Spogliano longitudinali CR/LF
CAgentMan m;
tcscpy (am.szCommand, szString);
tcscpy (am.szCommand2, szString);
Se (fgets (szString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\0'; / / Spogliano longitudinali CR/LF
tcscpy (am.szText, szString);
tcscpy (am.szText2, szString);
}
am.dwBookmark = + + cFiles;
Se (! m_rgRowData.Add(am))
{
ATLTRACE ("non poteva aggiungere dati a matrice");
fclose(pFile);
restituire E_FAIL;
}
}
Se (pcRowsAffected! = NULL)
* pcRowsAffected = cFiles;
restituisce S_OK;
}