Partager via


Lecture de chaînes dans le fournisseur OLE DB

La CCustomRowset::Execute fonction ouvre un fichier et lit les chaînes. Le consommateur transmet le nom de fichier au fournisseur en appelant ICommandText ::SetCommandText. Le fournisseur reçoit le nom de fichier et le stocke dans la variable m_strCommandTextmembre. Execute lit le nom du fichier à partir de m_strCommandText. 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’il lit, Execute crée une instance de l’enregistrement utilisateur (modifiée CCustomWindowsFile à partir du stockage de chaînes dans le fournisseur OLE DB) et la place dans un tableau.

Si le fichier ne peut pas être ouvert, Execute doit retourner DB_E_NOTABLE. S’il retourne E_FAIL à la place, le fournisseur ne fonctionne pas avec de nombreux consommateurs et ne passe pas les tests de conformité OLE DB.

Exemple

/////////////////////////////////////////////////////////////////////////
// CustomRS.h
class CCustomRowset : public CRowsetImpl< CCustomRowset, CCustomWindowsFile, CCustomCommand>
{
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;

        ObjectLock lock(this);

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

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

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

Une fois cette opération effectuée, votre fournisseur doit être prêt à compiler et à s’exécuter. Pour tester le fournisseur, vous avez besoin d’un consommateur avec des fonctionnalités correspondantes. L’implémentation d’un consommateur simple montre comment créer un tel consommateur de test. Exécutez le consommateur de test avec le fournisseur et vérifiez que le consommateur de test récupère les chaînes appropriées du fournisseur.

Lorsque vous avez testé correctement votre fournisseur, vous souhaiterez peut-être améliorer ses fonctionnalités en implémentant des interfaces supplémentaires. Un exemple est illustré dans l’amélioration du fournisseur en lecture seule simple.

Voir aussi

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