• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1619
  • Last Modified:

MFC CDaoDatabase ODBC connection to .MDB file

I am using the CDaoDatabase class to create and open an empty .MDB file.  I then create a CDaoTableDef object and try to create a connection to another .MDB file using ODBC.  I get errors in the create and append.  Any ideas? Here's my code :

CSPSDataAccess TestData; // derived from CObject
TestData.OpenMDB("d:\\recipes\\test.mdb"); // has a member variable m_DatabaseFile pointing to the CDaoDatabase object

CDaoTableDef* pODBCTable = new CDaoTableDef(&TestData.m_DatabaseFile);
CDaoRecordset Records(&TestData.m_DatabaseFile);
1 Solution
blevineAuthor Commented:
The error message is "No field defined - cannot append tabledef"
i know this sounds daft but, did you try creating a field?  

mmachie is right. In order to append a tabledef, you have to create fields first, e.g.

        CDaoTableDef*  ptd;

        // ...

        CDaoFieldInfo* pdfi = new CDaoFieldInfo();

                pdfi->m_nOrdinalPosition    =   0;
                pdfi->m_strSourceField      =   _T  (   "");
                pdfi->m_strSourceTable      =   _T  (   "");

                ptd->CreateField    (   *pdfi);

        // ...

        ptd->Append ();

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

blevineAuthor Commented:
No, what I am trying to do is open an empty .MDB file and connect to an existing .MDB file which may be on my machine or on a network drive.  I then want to determine what the table info is in .MDB file I connected to.  I do not know what the format is in that file.  I then want to extract the table information from the connected file and created table defs in the empty original .MDB file.  The documentation says that I should be able to connect through ODBC to the existing MDB file and use it as part of my tables.
what's the DAO error code (obtain it from the dbDaoErrors object)...
You can't use CDao anything to talk to an access database through ODBC because the ODBC driver uses DAO to talk to the mdb.  Use CDatabase and CRecordset if you need to use ODBC,  otherwise, open it directly with DAO.  Create a seperate workspace if you need to.

blevineAuthor Commented:
Ok that sounds good.  I really need to attach to the table without opening it directly because I will be dealing with a huge amount of data.  Any samples on attaching and accessing record sets would be appreciated.  Also, how do I attach to SQL Server files using CDatabase?????
this is the form of an odbc connect string

CDatabase myDB;
myDB.Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE,  PUT_YOUR_ODBC_CONNECT_HERE, BOOL bUseCursorLib = TRUE );
// sample i Have use to connect to SQL 6.x

if(m_bUseODBC) {
            CString strConnect;
                m_strConnect, m_strUser, m_strPwd);
           if(_debug)  MessageBox("Prepare for odbc " + strConnect);
            m_pDB->Open("", FALSE, FALSE, strConnect);                

If you want to work through an attached file via Access, create a sytem DSN ODBC datasource pointing to your SQL database.  Open an existing or new db.
Go to File | Get External Data | Link Tables.  Select ODBC datasources from file types,  pick your Datasource,  pick the tables you want to link,  rename them after they are linked if you like, they will stay linked.

This works for all sorts of data,  AS 400,  DB2, etc.


Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now