Partager via


Lecture de chaînes dans le fournisseur OLE DB

La fonction RMyProviderRowset::Execute ouvre un fichier et procède à la lecture des chaînes. Le consommateur passe le nom de fichier au fournisseur en appelant ICommandText::SetCommandText. Le fournisseur reçoit le nom de fichier et le stocke dans la variable membre m_szCommandText. Execute lit le nom de fichier depuis m_szCommandText. Si le nom de fichier n'est pas valide ou si le fichier n'est pas disponible, Execute retourne une erreur. Sinon, il ouvre le fichier et appelle fgets pour récupérer les chaînes. Pour chaque jeu de chaînes qu'elle lit, Execute crée une instance de l'enregistrement utilisateur (CAgentMan) et la place dans un tableau.

Si le fichier ne peut pas être ouvert, Execute doit retourner DB_E_NOTABLE. Si elle retourne E_FAIL, le fournisseur ne fonctionnera pas avec beaucoup de consommateurs et ne réussira pas les tests de compatibilité OLE DB.

Exemple

Description

La fonction Execute modifiée ressemble au texte suivant :

Code

/////////////////////////////////////////////////////////////////////////
// MyProviderRS.h
class RMyProviderRowset : public CRowsetImpl< RMyProviderRowset, CAgentMan, CRMyProviderCommand>
{
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;        errcodeerr;

        ObjectLock lock(this);

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

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

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

Voir aussi

Référence

Implémentation d'un fournisseur simple accessible en lecture seule