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
/
field.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
6KB
|
218 lines
// field.cpp : MFC DAO Field 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.
//
// all the field specific functions:
//
//BOOL IsExistentField(CDaoTableDef *pTableDef, CString strFieldName);
//BOOL createNewField(CDaoTableDef *pTableDef, CDaoFieldInfo *pFieldInfo);
//BOOL getFieldInfo(CDaoTableDef *pTableDef, CDaoFieldInfo *pFieldInfo,
// int fieldIndex, BOOL bReportErrors = TRUE);
//BOOL deleteField(CDaoTableDef *pTableDef, CString strFieldName);
#include "stdafx.h"
#include "field.h"
// check for duplicate field name in field collection
// of tabledef object
// IN: pTableDef--the tabledef whose fields collection we access
// IN: strFieldName--the name of the field to check for existence
// RETURN: TRUE if field already exists in collection, FALSE otherwise
BOOL IsExistentField(CDaoTableDef *pTableDef, CString strFieldName)
{
// if the tabledef is non-existent, then the answer is obvious
if (pTableDef == NULL)
return FALSE;
// initialize status indicator
BOOL bDuplicateFieldName = TRUE;
// see if there is a field by this name already--duplicate
// named fields are not accepted
CDaoFieldInfo fieldInfo; // only needed for the call
// MFC exception handler macros used
TRY
{
// this call will throw an exception if there is no
// field by the specified name--test for duplication
pTableDef->GetFieldInfo(strFieldName, fieldInfo);
}
CATCH (CDaoException, e)
{
// if this is an 'Item not found' exception, we are
// cleared to create the field -- else this is
// a duplicate field name and we got another exception
// which is irrelevant for our purposes
if (e->m_pErrorInfo->m_lErrorCode == 3265)
bDuplicateFieldName = FALSE;
}
AND_CATCH (CMemoryException, e)
{
// do nothing--no need to process errors since this is
// just a duplicate checker
}
END_CATCH
return bDuplicateFieldName;
}
// wraps the CreateField DAO call in an exception handler
// IN: pTableDef--the tabledef whose fields collection we access
// IN: pFieldInfo--information used to create field
// RETURN: TRUE if creation succeeds, FALSE if it fails
BOOL createNewField(CDaoTableDef *pTableDef, CDaoFieldInfo *pFieldInfo)
{
// if the tabledef is non-existent, then the answer is obvious
if (pTableDef == NULL)
return FALSE;
// check for existing field with this name just to be safe
if (IsExistentField(pTableDef, pFieldInfo->m_strName))
{
AfxMessageBox(_T("A field by that name already exists."));
// return FALSE since can't create duplicate field
return FALSE;
}
// initialize failure indicators
BOOL bCreateFailed = FALSE;
// create a field with the specified properties
// it is automatically appended to field collection
// of the tabledef
TRY
{
pTableDef->CreateField(*pFieldInfo);
}
CATCH (CDaoException, e)
{
// construct a meaningful message
CString message = _T("Couldn't create field--Exception: ");
message += e->m_pErrorInfo->m_strDescription;
// display message
AfxMessageBox(message);
// indicate failure
bCreateFailed = TRUE;
}
AND_CATCH (CMemoryException, e)
{
AfxMessageBox(_T("Failed to create field--Memory exception thrown."));
// indicate failure
bCreateFailed = TRUE;
}
END_CATCH
// return TRUE if creation succeeds
return (!bCreateFailed);
}
// fill a fieldinfo struct with the field's properties--handle exceptions
// IN: pTableDef--the tabledef whose fields collection we access
// OUT: pFieldInfo--information we get from the field in the collection
// IN: fieldIndex--the index into the collection for the item we want
// IN: bReportErrors--if TRUE, then report any problems, else silent
// TRUE by default
// RETURN: TRUE if information was obtained, FALSE indicates pFieldInfo
// does not contain informaton that was requested
BOOL getFieldInfo(CDaoTableDef *pTableDef, CDaoFieldInfo *pFieldInfo,
int fieldIndex, BOOL bReportErrors /* = TRUE */)
{
// if the tabledef is non-existent, then the answer is obvious
if (pTableDef == NULL)
return FALSE;
// initialize success indicator
BOOL bSuccess = TRUE;
TRY
{
// try to get info on the field
pTableDef->GetFieldInfo(fieldIndex, *pFieldInfo,
AFX_DAO_ALL_INFO );
}
CATCH (CDaoException, e)
{
// construct a meaningful message if request
if (bReportErrors)
{
CString strMessage = _T("Couldn't get information on field--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 field--Memory exception thrown."));
// indicate failure
bSuccess = FALSE;
}
END_CATCH
// return status
return bSuccess;
}
// wrap field deletion with exception handlers
// IN: pTableDef--the tabledef whose fields collection we access
// IN: strFieldName--name of field to delete
// RETURN: TRUE if deletion succeeded, FALSE otherwise
BOOL deleteField(CDaoTableDef *pTableDef, CString strFieldName)
{
// if the tabledef is non-existent, then the answer is obvious
if (pTableDef == NULL)
return FALSE;
// initialize success indicator
BOOL bSuccess = TRUE;
// MFC exception handler macros used
TRY
{
// this call will throw an exception if there is no
// field by the specified name--test for duplication
pTableDef->DeleteField(strFieldName);
}
CATCH (CDaoException, e)
{
CString strMessage = _T("Couldn't delete the field--Exception: ");
strMessage += e->m_pErrorInfo->m_strDescription;
AfxMessageBox(strMessage);
// indicate failure
bSuccess = FALSE;
}
AND_CATCH (CMemoryException, e)
{
AfxMessageBox(_T("Failed to delete the field--Memory exception thrown."));
// indicate failure
bSuccess = FALSE;
}
END_CATCH
return bSuccess;
}