home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
mfc
/
database
/
daotable
/
tabledef.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
10KB
|
352 lines
// tabledef.cpp : MFC DAO TableDef specific functions
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
// contains:
//
//BOOL IsExistentTable(CDaoDatabase *pDatabase, CString strTableName);
//BOOL createNewTableDef(CDaoDatabase * pDatabase,
// CDaoTableDef **ppTableDef,
// CString strTableName);
//BOOL appendTableDef(CDaoDatabase *pDatabase, CDaoTableDef *pTableDef);
//BOOL openTableDef(CDaoDatabase * pDatabase, CDaoTableDef **ppTableDef,
// CString strTableName);
//BOOL getTableInfo(CDaoDatabase *pDatabase, CDaoTableDefInfo *pTableInfo,
// int tableIndex, BOOL bReportErrors);
//void deleteTable(CDaoDatabase *pDatabase, CString strTableName);
#include "stdafx.h"
#include "tabledef.h"
// check for duplicate table name in tabledef collection
// of database object
// IN: pDatabase--pointer to database object whose tabledef collection we will
// access
// IN: strTableName--name of the table whose existence we want to check
// RETURN: TRUE if the table already exists, FALSE otherwise
BOOL IsExistentTable(CDaoDatabase *pDatabase, CString strTableName)
{
// if the database is non-existent, then the answer is obvious
if (pDatabase == NULL)
return FALSE;
// initialize status indicator
BOOL bDuplicateTableName = TRUE;
// see if there is a table by this name already--duplicate
// named tables are not accepted
CDaoTableDefInfo tableInfo; // only needed for the call
// MFC exception handler macros used
TRY
{
// this call will throw an exception if there is no
// table by the specified name--test for duplication
pDatabase->GetTableDefInfo(strTableName, tableInfo);
}
CATCH (CDaoException, e)
{
// if this is an 'Item not found' exception, we are
// cleared to create the table -- else this is
// a duplicate tablename and we got another exception
// which is irrelevant for our purposes
if (e->m_pErrorInfo->m_lErrorCode == 3265)
bDuplicateTableName = FALSE;
}
AND_CATCH (CMemoryException, e)
{
// do nothing
;
}
END_CATCH
return bDuplicateTableName;
}
// wraps the CreateTableDef call with an exception handler and duplicate
// name check
// IN: pDatabase--pointer to database object whose tabledef collection we will
// access
// OUT: ppTableDef--pointer to pointer to tabledef we are creating
// IN: strTableName--name of the table we want to create
// RETURN: TRUE if creation succeeds, FALSE otherwise
BOOL createNewTableDef(CDaoDatabase * pDatabase,
CDaoTableDef **ppTableDef,
CString strTableName)
{
// if the database is non-existent, then the answer is obvious
if (pDatabase == NULL)
return FALSE;
// check for existing table with this name just to be safe
if (IsExistentTable(pDatabase, strTableName))
{
AfxMessageBox(_T("A table by that name already exists."));
// return FALSE since can't create duplicate table
return FALSE;
}
// initialize creation failure indicator
BOOL bCreateFailed = FALSE;
// construct tabledef
*ppTableDef = new CDaoTableDef(pDatabase);
// failed to allocate so exit
if ((*ppTableDef) == NULL)
return FALSE;
// no duplication, so create the tabledef if possible
TRY
{
(*ppTableDef)->Create(strTableName);
}
CATCH (CDaoException, e)
{
// construct a meaningful message
CString strMessage = _T("Couldn't create tabledef--Exception: ");
strMessage += e->m_pErrorInfo->m_strDescription;
AfxMessageBox(strMessage);
// indicate failure
bCreateFailed = TRUE;
// delete the tabledef on failure
if (*ppTableDef != NULL)
{
delete *ppTableDef;
*ppTableDef = NULL;
}
}
AND_CATCH (CMemoryException, e)
{
// output status
AfxMessageBox(_T("Failed to create tabledef--Memory exception thrown."));
// indicate failure
bCreateFailed = TRUE;
// delete the tabledef on failure
if (*ppTableDef != NULL)
{
delete *ppTableDef;
*ppTableDef = NULL;
}
}
END_CATCH
// return TRUE if creation succeeds
return (!bCreateFailed);
}
// wraps the OpenTableDef call with an exception handler
// IN: pDatabase--pointer to database object whose tabledef collection we will
// access
// OUT: ppTableDef--pointer to pointer to tabledef we are opening
// IN: strTableName--name of the table we want to open
// RETURN: TRUE if open succeeds, FALSE otherwise
BOOL openTableDef(CDaoDatabase * pDatabase, CDaoTableDef **ppTableDef,
CString strTableName)
{
// if the database is non-existent, then the answer is obvious
if (pDatabase == NULL)
return FALSE;
// initialize creation failure indicator
BOOL bOpenFailed = FALSE;
// construct tabledef
*ppTableDef = new CDaoTableDef(pDatabase);
// failed to allocate so exit
if ((*ppTableDef) == NULL)
return FALSE;
// open the tabledef if possible
TRY
{
(*ppTableDef)->Open(strTableName);
}
CATCH (CDaoException, e)
{
// construct a meaningful message
CString strMessage = _T("Couldn't open tabledef--Exception: ");
strMessage += e->m_pErrorInfo->m_strDescription;
AfxMessageBox(strMessage);
// indicate failure
bOpenFailed = TRUE;
// delete the tabledef on failure
if (*ppTableDef != NULL)
{
delete *ppTableDef;
*ppTableDef = NULL;
}
}
AND_CATCH (CMemoryException, e)
{
// output status
AfxMessageBox(_T("Failed to open tabledef--Memory exception thrown."));
// indicate failure
bOpenFailed = TRUE;
// delete the tabledef on failure
if (*ppTableDef != NULL)
{
delete *ppTableDef;
*ppTableDef = NULL;
}
}
END_CATCH
// return TRUE if open succeeds
return (!bOpenFailed);
}
// append the tabledef to the database collection
// IN: pDatabase--pointer to database object whose tabledef collection we will
// access
// IN: pTableDef--pointer tabledef we are appending to the collection
// RETURN: TRUE if append succeeds, FALSE otherwise
BOOL appendTableDef(CDaoDatabase *pDatabase, CDaoTableDef *pTableDef)
{
// if the database is non-existent, then the answer is obvious
if (pDatabase == NULL)
return FALSE;
// initialize success indicator
BOOL bSuccess = TRUE;
// append the tabledef to the collection
TRY
{
pTableDef->Append();
}
CATCH (CDaoException, e)
{
// construct informative message
CString strMessage = _T("Couldn't append TableDef--Exception: ");
strMessage += e->m_pErrorInfo->m_strDescription;
// output status
AfxMessageBox(strMessage);
// failure
bSuccess = FALSE;
}
AND_CATCH (CMemoryException, e)
{
// output status
AfxMessageBox(_T("Failed to append tabledef--Memory exception thrown."));
// failure
bSuccess = FALSE;
}
END_CATCH
// return status
return bSuccess;
}
// fill a tableinfo struct--handle exceptions
// IN: pDatabase--pointer to database object whose tabledef collection we will
// access
// OUT: pTableInfo--pointer to structure to hold the tabledef info
// IN: tableIndex--index into the collection indicating which item we want
// IN: bReportErrors--TRUE by default, if TRUE, report all errors, else silent
// RETURN: TRUE if information obtained, FALSE otherwise
BOOL getTableInfo(CDaoDatabase *pDatabase, CDaoTableDefInfo *pTableInfo,
int tableIndex, BOOL bReportErrors /*= TRUE*/)
{
// if the database is non-existent, then the answer is obvious
if (pDatabase == NULL)
return FALSE;
// initialize success indicator
BOOL bSuccess = TRUE;
TRY
{
// try to get info on the table
pDatabase->GetTableDefInfo(tableIndex, *pTableInfo, AFX_DAO_ALL_INFO );
}
CATCH (CDaoException, e)
{
// construct a meaningful message if request
if (bReportErrors)
{
CString strMessage = _T("Couldn't get information on table--Exception: ");
strMessage += e->m_pErrorInfo->m_strDescription;
AfxMessageBox(strMessage);
}
// indicate failure
bSuccess = FALSE;
}
AND_CATCH (CMemoryException, e)
{
// output status if requested
if (bReportErrors)
AfxMessageBox(_T("Failed to get info on table--Memory exception thrown."));
// indicate failure
bSuccess = FALSE;
}
END_CATCH
// return status
return bSuccess;
}
// detete the specified table from the collection of tables
// IN: pDatabase--pointer to database object whose tabledef collection we will
// access
// IN: strTableName--name of the table we want to delete
void deleteTable(CDaoDatabase *pDatabase, CString strTableName)
{
// if the database is non-existent, then the answer is obvious
if (pDatabase == NULL)
return;
// see if there is a table by this name -- if not, can't proceed
if (!IsExistentTable(pDatabase, strTableName))
return;
// MFC exception handler macros used
TRY
{
pDatabase->DeleteTableDef(strTableName);
}
CATCH (CDaoException, e)
{
// construct a meaningful message if request
CString strMessage = _T("Couldn't delete the table--Exception: ");
strMessage += e->m_pErrorInfo->m_strDescription;
AfxMessageBox(strMessage);
}
AND_CATCH (CMemoryException, e)
{
// output status if requested
AfxMessageBox(_T("Failed to delete the table--Memory exception thrown."));
}
END_CATCH
return;
}