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