Chaînes de lecture dans le fournisseur OLE DB

Les RMyProviderRowset::Execute fonction ouvre un fichier et 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 de m_szCommandText . Si le nom du fichier est incorrect ou le fichier n'est pas disponible, Execute renvoie une erreur. Sinon, il ouvre le fichier et appelle fgets pour récupérer les chaînes. Pour chaque jeu de chaînes il lectures, Execute crée une instance de l'enregistrement utilisateur ( CAgentMan ) et le place dans un tableau.

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

L'édité Execute fonction ressemble à ceci:

/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
classe RMyProviderRowset : CRowsetImpllt public ; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
public :
   
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
 USES_CONVERSION ;
 FICHIER * pFile ;
 TCHAR szString [256] ;
 SzFile TCHAR [MAX_PATH] ;
 size_t nLength ;
 ObjectLock lock(this) ;

/ / D'un nom de fichier, passé comme un texte de la commande, analyse le fichier
 / / placer les données dans le tableau de données.
 Si (! m_szCommandText)
 {
    ATLTRACE ("aucun nom de fichier spécifié ») ;
    retour E_FAIL ;
 }

/ / Ouvrir le fichier
 _tcscpy (szFile, m_szCommandText) ;
 Si (szFile [0] == _T('\0') || ((fichier pFile = fopen (& szFile [0], "r")) == NULL))
 {
    ATLTRACE ("Impossible d'ouvrir fichier") ;
    retour de DB_E_NOTABLE ;
 }

/ / scanner et analyser le fichier.  Le fichier doit contenir deux chaînes par enregistrement
 CFiles LONG = 0 ;
 alors que (fgets (szString, 256, pFile)! = NULL)
 {
    nLength = strlen(szString) ;
    szString [nLength-1] = « \0 » ;   / / Enlever fuite CR/LF
    CAgentMan am ;
    _tcscpy (am.szCommand, szString) ;
    _tcscpy (am.szCommand2, szString) ;

Si (fgets (szString, 256, pFile)! = NULL)
    {
       nLength = strlen(szString) ;
       szString [nLength-1] = « \0 » ;   / / Enlever fuite CR/LF
       _tcscpy (am.szText, szString) ;
       _tcscpy (am.szText2, szString) ;
    }

Am.dwBookmark = ++ cFiles ;
    Si (! m_rgRowData.Add(am))
    {
       ATLTRACE (« ne pouvait pas ajouter des données au tableau") ;
       fclose(pfile) ;
       retour E_FAIL ;
    }
 }

Si (pcRowsAffected! = NULL)
    * pcRowsAffected = cFiles ;
 return S_OK ;
}

Index