Cadenas de lectura en el proveedor OLE DB

La RMyProviderRowset::Execute función abre un archivo y Lee cadenas. El consumidor pasa el nombre del archivo al proveedor llamando ICommandText:: SetCommandText. El proveedor recibe el nombre de archivo y lo almacena en la variable miembro m_szCommandText . Execute Lee el nombre de m_szCommandText . Si el nombre del archivo no es válida o el archivo no está disponible, Execute devuelve un error. De lo contrario, abre el archivo y llama a fgets para recuperar las cuerdas. Para cada conjunto de cadenas lecturas, Execute crea una instancia de registro de usuario ( CAgentMan ) y la coloca en una matriz.

Si no se puede abrir el archivo, Execute debe devolver DB_E_NOTABLE. Si devuelve E_FAIL en su lugar, el proveedor no funcionará con muchos consumidores y no pasarán las pruebas de conformidad de OLE DB.

El editado Execute función este aspecto:

/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
clase RMyProviderRowset: CRowsetImpllt pública; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
público:
   
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
 USES_CONVERSION;
 ARCHIVO * pArchivo;
 TCHAR szString [256];
 TCHAR szFile [MAX_PATH];
 size_t nLength;
 ObjectLock lock(this);

/ / De un nombre de archivo, pasada como un texto de comando, analizar el archivo
 / / colocar datos en la matriz de datos.
 Si (! m_szCommandText)
 {
    ATLTRACE ("ningún nombre de archivo especificado");
    devolver E_FAIL;
 }

/ / Abrir el archivo
 _tcscpy (szFile, m_szCommandText);
 Si (szFile [0] == _T('\0') || ((pFile = fopen (& szFile [0], "r")) == NULL))
 {
    ATLTRACE ("no se pudo abrir archivo");
    Return DB_E_NOTABLE;
 }

/ / análisis y analizar el archivo.  El archivo debe contener dos cadenas por registro
 CFiles largo = 0;
 mientras (fgets (szString, 256, pArchivo)! = NULL)
 {
    nLength = strlen(szString);
    szString [nLength-1] = '\0';   / / Tira fuera perdiendo CR/LF
    Estoy CAgentMan;
    _tcscpy (am.szCommand, szString);
    _tcscpy (am.szCommand2, szString);

Si (fgets (szString, 256, pArchivo)! = NULL)
    {
       nLength = strlen(szString);
       szString [nLength-1] = '\0';   / / Tira fuera perdiendo CR/LF
       _tcscpy (am.szText, szString);
       _tcscpy (am.szText2, szString);
    }

AM.dwBookmark = ++ cFiles;
    Si (! m_rgRowData.Add(am))
    {
       ATLTRACE ("no se pudo agregar datos a la matriz");
       fclose(pFile);
       devolver E_FAIL;
    }
 }

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

Index