Stringhe di lettura nel Provider OLE DB

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

Index