C/Visual C - abrir dbf de visual foxpro5 con c/c++

 
Vista:

abrir dbf de visual foxpro5 con c/c++

Publicado por koldo (2 intervenciones) el 02/10/2003 23:25:06
Hola
Tengo una tabla de visual foxpro5 y no sé cómo se abre con C.
Me podria alguien enviar un ejemplo o explicarme cómo se abre?
Graicas.

[email protected]
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

1. Con el API de ODBC

Publicado por fernando.gomez (1603 intervenciones) el 07/10/2003 01:12:44
#include <sql.h>
#include <sqlext.h>
// ...
void OpenDataBase(LPCTSTR szDsn, LPCTSTR szDbUid, LPCTSTR szDbPwd)
{
HRESULT hRet;
HENV henv;
HDBC hdbc;
HSTMT hstmt;
LPTSTR szCnnStr;
SQLTCHAR szIn[512];
SQLTCHAR szOut[512];
SQLINTEGER nOut;

hRet = ::SQLAllocEnv(&henv);
if (hRet == SQL_SUCCESS || hRet == SQL_SUCCESS_WITH_INFO)
{ // ya abriste tu entorno
hRet = ::SQLAllocConnect(henv, &hdbc);
if (hRet == SQL_SUCCESS || hRet == SQL_SUCCESS_WITH_INFO)
{ // ya abriste tu conexión de base de datos
wsprintf(szCnnStr, _T("DSN=%s; UID=%s; PWD=%s"), szDsn, szDbUid, szDbPwd);
memcpy(szIn, szCnnStr, sizeof(szCnnStr));
hRet = ::SQLDriverConnect(hdbc, NULL, szIn, sizeof(szIn), szOut, sizeof(szOut), &nOut, 0);
if (hRet == SQL_SUCCESS || hRet == SQL_SUCCESS_WITH_INFO)
{ // ya abriste tu base de datos FoxPro!
/* ahora, puedes ubicar un HSTMT con ::SQLAllocStmt, puedes usar SQLExecDirect para abrir un query; SQLBind y SQLFetch para acomodar tus filas de datos; y SQLGetData para obtener tus datos */
}
}
// recuerda siempre liberar tus HRESULTS
::SQLFreeStmt(hstmt, SQL_DROP);
::SQLFreeConnect(hdbc);
::SQLFreeEnv(henv, SQL_DROP);
}
// perdón si me faltó alguna llave de cierre.
}



Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

2. Con MFC

Publicado por fernando.gomez (1603 intervenciones) el 07/10/2003 01:34:30
#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;
}

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar