PDA

Visualizza la versione completa : [c++ mfc]dao , access e connection


giuseppe500
06-03-2008, 10:38
ciao.
Sto lavorando ad un progetto in vc++ 7 che usa dao e un database access.
la domanda è questa:
E' possibile connettersi al db con una connessione e aprire piu' di un recordset con questa connessione?
o si deve aprire una connessione per ogni recordset?
grazie.

oregon
06-03-2008, 10:49
Una connessione e' sufficiente per piu' recordset ... (e meno male ...)

giuseppe500
06-03-2008, 13:31
grazie Oregon , solo che ho queto problema :
Devo importare moltissimi dati e arrivato alla seguente funzione:
m_pRsShell= m_dbEngine->returnRecordset("Select * from [Connectivity - Area]",m_pDB);
if(m_pRsShell)
m_pRsShell->MoveFirst();

la query ritorna null! se invece chiudo la connessione e la riapro tutto funziona correttamente!.
possono esssere problemi di memoria?
Qesto è il m_dbEngine:

#include "stdafx.h"
#include "dbdao.h"
CDaoDB::CDaoDB()
{
}

CDaoDB::~CDaoDB()
{
}
DAORecordset * CDaoDB::returnRecordset(CString sql,DAODatabase * pDB)
{
DAOQueryDef * query=NULL;
COleVariant empty;
COleVariant strSql(_T(sql), VT_BSTRT);
COleVariant strQueryName;
DAORecordset * rs=NULL;

LPCSTR str=(LPCSTR)"";
strQueryName.SetString(str,VT_BSTRT);
if(pDB)
{
pDB->CreateQueryDef(strQueryName,strSql ,&query);
COleVariant varOptRecorsdset(((long)dbReadOnly),VT_I4);
COleVariant varLockType(((long)dbPessimistic),VT_I4);
COleVariant varType(((long)dbOpenDynaset),VT_I4);
query->OpenRecordset(varType,empty,varLockType,&rs);
query->Release();
}
return rs;
}
DAODatabase * CDaoDB::ConnectDb(CString strDb)
{

DAODBEngine * pEngine = AfxDaoGetEngine();

if (pEngine == NULL)
{
AfxDaoInit();
pEngine = AfxDaoGetEngine();
}


COleVariant varFileName(_T(strDb), VT_BSTRT);
COleVariant varLocale(dbLangGeneral, VT_BSTRT);
COleVariant varOption = (long)dbVersion30;
COleVariant empty;

DAODatabase * pDB = NULL;
pEngine->OpenDatabase(V_BSTR(&varFileName),empty,empty,empty, &pDB);

pEngine->Release();
return pDB;
}

potrebbe essere che non faccio il delete degli oggetti del dao qundo non servono piu'?
o è altro?
perchè se provo a fare il delete di un recordset mi da errore ad es:
delete m_pRs mi da il solito hai provato a crivere su 002313123 ?



cosa puo' essere?
grazie.

giuseppe500
06-03-2008, 18:23
ho trovato un piccola libreria :
bool CDaoDB::dbOpen(CString strFilePathName)
{
try
{
db = new CDaoDatabase(NULL);
db->Open(strFilePathName);
return true;
}
catch(CDaoException* error)
{
delete db;
db = NULL;

LPTSTR errors = "";
error->GetErrorMessage(errors,100,NULL);
AfxMessageBox(errors);
return false;
}
}
questa funzione che apre una connessione è da richiamare tutte le volte che apro un recordset?
perchè non ha il metodo open() , metre ha il metodo close().

Loading