CDao usage from console app ?
Don O'Hara -- dohara@epix.net
Friday, November 22, 1996
Environment: VC++ 4.2-flat, Windows 95
I am having run-time cleanup problems with code similar
to the following. I can open the db OK, but am
getting assertion failures in DAOCORE.CPP, line 36,
when the program shuts down.
(i loaded the source from the daosdk, but can't find that module).
Am i missing something needed by mfc console apps??
I'd like to keep this a console app if possible...
thanks!
//==================================
// cn_mfc.cpp
#include
#include
#include
CDaoDatabase cdb;
CDaoException exception ;
//==================================
void main()
{
cout << " starting..." << endl ;
cdb.Open( "d:\\amm\\cn_mfc\\tables\\ammd_95.mdb") ;
if ( cdb.IsOpen() )
{
cout << "open !" << endl ;
cdb.Close() ;
}
else
cout << "closed !" << endl ;
cout << " ending " << endl ;
return ;
}
Neil A. Van Note -- vannote@netaxs.com
Sunday, November 24, 1996
[Mini-digest: 2 responses]
Hello Don,
> Environment: VC++ 4.2-flat, Windows 95
>
> I am having run-time cleanup problems with code similar
> to the following. I can open the db OK, but am
> getting assertion failures in DAOCORE.CPP, line 36,
> when the program shuts down.
>
> (i loaded the source from the daosdk, but can't find that module).
>
> Am i missing something needed by mfc console apps??
>
> I'd like to keep this a console app if possible...
Look at AfxDaoTerm(), Considering you don't have a CWinApp
object here, you must call this explicitly before your main
exits. Something like the following works fine...
if (!AfxGetApp())
AfxDaoTerm();
Cheers,
Neil A. Van Note
R&D Software Engineer
XRT Financial Systems, Inc.
http://www.xrt.com/
nvannote@xrt.com
vannote@netaxs.com
-----From: Mike Blaszczak
At 18:22 11/22/96 -0500, Don O'Hara wrote:
>Environment: VC++ 4.2-flat, Windows 95
>I am having run-time cleanup problems with code similar
>to the following. I can open the db OK, but am
>getting assertion failures in DAOCORE.CPP, line 36,
>when the program shuts down.
This assertion usually means that you didn't properly shut down DAO.
>(i loaded the source from the daosdk, but can't find that module).
This file name is actually an MFC file. You're using CDaoDatabase
and that's an MFC class, not a DAO SDK class.
>Am i missing something needed by mfc console apps??
Your code has lots of problems, and I'm not sure I can address them
all. You're missing something needed by _any_ MFC-based DAO
application, wether it uses MFC or not.
1) You declare a global instance of CDaoException. There's no reason
to do that--you never reference it, and nobody else will ever
reference it.
2) Ironically, you never bother to check any return codes.
CDaoDatabase::Open() can throw an excpetion, and for most people
on the list who try and run your code, it will--they won't have
a database file at D:\AMM\CN_MFC\TABLES\AMMD_95.MDB. Someday,
your code will break for you and your users--and they'll end up
looking at nothing more than an "unhandled exception" error
message.
3) You never call AfxDaoInit() or AfxDaoTerm(). This is probably
what directly causes the assertion that you're tripping; you're
shutting down MFC and you haven't shut down DAO. MFC realizes
that's a great way to leak resources, and is trying to help you
by pointing out the fallacy in your code.
4) You never initialize MFC. You don't need to shut down MFC, but
if you're using DAO, it would be a good idea to get MFC properly
initialized.
5) It's rather risky to use MFC objects at the global scope because
MFC might or might not have been initialized before the objects
are constructed.
I think that a corrected version of your sample might look
something more like this:
//==================================
// cn_mfc.cpp
#include
#include
#include
CDaoDatabase cdb;
CWinApp theApp; // don't even need to make your own
//==================================
void main()
{
if (!AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0))
return; // game over, man
AfxDaoInit();
cout << " starting..." << endl ;
try
{
cdb.Open( "c:\\dumpsome\\employee.mdb") ;
}
catch (CDaoException* pEx)
{
char sz[1023];
pEx->GetErrorMessage(sz, 1023);
cout << sz;
return;
}
if ( cdb.IsOpen() )
{
cout << "open !" << endl ;
cdb.Close() ;
}
else
cout << "closed !" << endl ;
cout << " ending " << endl ;
AfxDaoTerm();
return ;
}
By properly initializing MFC, and by properly starting and shutting down
DAO, you'll be in much better shape.
.B ekiM
http://www.nwlink.com/~mikeblas/
I'm afraid I've become some sort of speed freak.
These words are my own. I do not speak on behalf of Microsoft.
| Вернуться в корень Архива
|