Using DAO from a DLL
Microsoft's Visual C++ on-line help says that DAO is safe to use in DLL's. Therefore, I created a DLL which I use to access the same database my main application thread is accessing, in order to do a background report with one worker thread..
From the main application's point of view it is creating wrapper objects in a DLL. The wrapper objects, in turn, access the database and return the results to the application.
It is a single-threaded DLL but it could probably be modified to be thread-safe by using locks.
I list the code for one wrapper class here but you could put many different recordset wrappers into the DLL project.
Here's some of the code in my DLL:
class CMyRecordsetWrapper : public CCmdTarget
{
DECLARE_DYNCREATE(CMyRecordsetWrapper)
// protected constructor used by dynamic creation
CMyRecordsetWrapper();
CMyRecordsetWrapper(CString filename);
// Attributes
public:
CMyRecordset* myrecordset;
long m_index;
long m_time;
long m_eventtype;
CString m_title;
long m_binarydataindex;
long m_offset;
long m_length;
// Operations
public:
void Open(int thetype, LPCTSTR sqlstring, int themode);
BOOL IsBOF();
BOOL IsEOF();
void MoveFirst();
void MoveLast();
LONG GetRecordCount();
void Close();
void MoveNext();
BOOL FindNext(LPCTSTR lpszFilter);
BOOL FindPrev(LPCTSTR lpszFilter);
BOOL CanRestart();
void copyem();
void opentherecordset();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyRecordsetWrapper)
//}}AFX_VIRTUAL
// Implementation
virtual ~CMyRecordsetWrapper();
protected:
// Generated message map functions
//{{AFX_MSG(CMyRecordsetWrapper)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CMyRecordsetWrapper::CMyRecordsetWrapper(CString filename)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (theApp.databaseopen == 0)
{
AfxDaoInit( );
theApp.eventdatabase = new CDaoDatabase;
theApp.eventdatabase->Open(filename);
}
// increment reference count
theApp.databaseopen++;
opentherecordset();
}
CMyRecordsetWrapper::~CMyRecordsetWrapper()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
delete myrecordset;
theApp.databaseopen--;
if (theApp.databaseopen == 0)
{
theApp.eventdatabase->Close();
delete theApp.eventdatabase;
AfxDaoTerm();
}
}
void CMyRecordsetWrapper::opentherecordset()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
myrecordset = new CMyRecordset(theApp.eventdatabase);
}
void CMyRecordsetWrapper::Close()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
myrecordset->Close();
}
void CMyRecordsetWrapper::MoveFirst()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
myrecordset->MoveFirst();
copyem();
}
void CMyRecordsetWrapper::copyem()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_index = myrecordset->m_index;
m_time = myrecordset->m_time;
m_eventtype = myrecordset->m_eventtype;
m_title = myrecordset->m_title;
m_binarydataindex = myrecordset->m_binarydataindex;
m_offset = myrecordset->m_offset;
m_length = myrecordset->m_length;
}

Comments
How to attach table from a database
Posted by Legacy on 08/01/2002 12:00amOriginally posted by: LKp
I want to copy a table from another database to a new database using dao but i don't know how to do it pls help!!!
Reply