#include <afxdb.h>
// ...
void OpenDataBase(LPCTSTR szDsn, LPCTSTR szDbUid, LPCTSTR szDbPwd)
{
LPTSTR szCnnStr;
CDatabase pDBase = new CDatabase;
wsprintf(szCnnStr, _T("DSN=%s; UID=%s; PWD=%s"), szDsn, szDbUid, szDbPwd);
pDBase->OpenEx(szCnnStr);
CRecordset obRecordset(&pDBase);
// ya abriste tu base de datos FoxPro! Ahora haces los querys
CString csSql = _T("select empno from nmempl");
obRecordset.Open(AFX_DB_USE_DEFAULT_TYPE, csSql);
// empleas GetFieldValue para obtener los datos
/* si vas a ejecutar algún Update o Insert o algún query que no regrese datos, emplea CDatabase::ExecuteSQL */
pDBase->ExecuteSQL(_T("update nmempl set password = N'9'"));
// y cierras las conexiones en algún lado
obRecordset.Close();
/* nunca cierres la base de datos antes que el recordset. De hecho, si cierras la base de datos EN EL MISMO METODO que abres el recordset, al llamar al destructor de CRecordset, te va a lanzar una excepción, aún en el caso de que emplees CRecordset::Close() antes de la sentencia de delete pDBase. Por ello, yo prefiero, en el constructor de mi clase, mandar abrir CDatabase, y en los métodos, crear mis CRecordsets. finalmente, en mi destructor, llamo a CDatabase::~CDatabase. Todo este relajo, porque CRecordset::~CRecordset verifica que, al cerrar el recordset, tu referencia a CDatabase SIGA ESTANDO ABIERTA. Se suponía que esto iba a quedar arreglado en MFC7, pero no fué así. */
pDBase->Close();
delete pDBase;
}