1898 lines
44 KiB
C++
1898 lines
44 KiB
C++
/***************************************************
|
||
MFC DAO FrameWork Wrapper Class
|
||
Dundas Software Ltd. 1997 - 2003
|
||
****************************************************/
|
||
// Version: 9.3
|
||
|
||
|
||
#include "stdafx.h"
|
||
|
||
#include "OXDao.h"
|
||
|
||
#include "UTBStrOp.h"
|
||
|
||
// Comment out this define to eliminate message boxes in the
|
||
// DAO exception handlers - usefull for debugging...
|
||
// #define UG_DAO_REPORTERROR
|
||
|
||
|
||
/***************************************************
|
||
COXDao
|
||
Purpose
|
||
Initializes all member variables
|
||
Params
|
||
none
|
||
Return
|
||
none
|
||
****************************************************/
|
||
COXDao::COXDao(){
|
||
|
||
m_database = NULL;
|
||
m_recordSet = NULL;
|
||
m_tableDef = NULL;
|
||
m_queryDef = NULL;
|
||
m_fields = NULL;
|
||
|
||
m_password = "";
|
||
|
||
m_lastErrorCode = -1;
|
||
|
||
|
||
}
|
||
|
||
/***************************************************
|
||
~COXDao
|
||
Purpose
|
||
Closes all data objects
|
||
Params
|
||
none
|
||
Return
|
||
none
|
||
****************************************************/
|
||
COXDao::~COXDao(){
|
||
|
||
Close();
|
||
}
|
||
|
||
/***************************************************
|
||
SetErrorCode
|
||
Purpose
|
||
Used internally to set the last error code
|
||
This code can be retrieved by GetLastError
|
||
In debug mode this function posts TRACE
|
||
statements of all reported errors
|
||
Params
|
||
code - error code number 0 - n
|
||
Return
|
||
none
|
||
****************************************************/
|
||
void COXDao::SetErrorCode(int code){
|
||
|
||
m_lastErrorCode = code;
|
||
|
||
TRACE(COXDao_errorStrings[m_lastErrorCode]);
|
||
TRACE(_T("\n"));
|
||
}
|
||
|
||
/***************************************************
|
||
GetLastError
|
||
Purpose
|
||
If a function fails call this to retrieve
|
||
extended error information. Also see the
|
||
funciton GetLastErrorText to retrieve an
|
||
associated text error message.
|
||
Params
|
||
none
|
||
Return
|
||
none
|
||
****************************************************/
|
||
int COXDao::GetLastError(){
|
||
|
||
return m_lastErrorCode;
|
||
}
|
||
|
||
/***************************************************
|
||
GetLastErrorText
|
||
Purpose
|
||
Returns a constant string containing a message
|
||
on the last error.
|
||
Params
|
||
none
|
||
Return
|
||
none
|
||
****************************************************/
|
||
LPCTSTR COXDao::GetLastErrorText(){
|
||
|
||
if(m_lastErrorCode < 0)
|
||
{
|
||
CString sError;
|
||
VERIFY(sError.LoadString(IDS_OX_DAONOERROR));//"No Error"
|
||
return sError;
|
||
}
|
||
|
||
return COXDao_errorStrings[m_lastErrorCode];
|
||
}
|
||
|
||
/***************************************************
|
||
Open
|
||
Purpose
|
||
Opens the specified table in the specified
|
||
database. This function opens the full table
|
||
as a dynaset. To open using other modes please
|
||
use the last version of the open function.
|
||
Params
|
||
database - name of the database to open (ex. c:\data.mdb)
|
||
table - name of the table in the database to open
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::Open(LPCTSTR database,LPCTSTR table){
|
||
|
||
return Open(database,table,dbOpenDynaset,NULL,0);
|
||
}
|
||
|
||
/***************************************************
|
||
Open
|
||
Purpose
|
||
Excutes the specified SQL query in the specified
|
||
database. The result set is opened as a
|
||
dynaset. To open using other modes please
|
||
use the last version of the open function.
|
||
Params
|
||
database - name of the database to open (ex. c:\data.mdb)
|
||
sql - query to run (ex. SELECT * from MyTable)
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::OpenSQL(LPCTSTR database,LPCTSTR sql){
|
||
|
||
return Open(database,NULL,dbOpenDynaset,sql,0);
|
||
}
|
||
|
||
/***************************************************
|
||
Open
|
||
Purpose
|
||
Opens the specified table or SQL statement on
|
||
the specified database. If the 'sql' parameter
|
||
is NULL then the 'table' param is used, otherwise
|
||
the 'sql' param is used.
|
||
|
||
Params
|
||
database - name of the database to open (ex. c:\data.mdb)
|
||
table - name of the table in the database to open
|
||
openType - type of table to open, possible types are
|
||
dbOpenDynaset,dbOpenTable<6C>,dbOpenSnapshot
|
||
(For more information see CDaoRecordset::Open)
|
||
sql - query to run (ex. SELECT * from MyTable)
|
||
options - specifies other opening options as listed below
|
||
dbAppendOnly, dbForwardOnly, dbSeeChanges, dbDenyWrite,
|
||
dbDenyRead, dbReadOnly, dbInconsistent, dbConsistent<6E><74><EFBFBD>
|
||
(For more information see CDaoRecordset::Open)
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::Open(LPCTSTR database,LPCTSTR table,int openType,LPCTSTR sql,
|
||
int options/*=0*/,CString optStr/*=_T("")*/)
|
||
{
|
||
//make sure that all database objects are closed
|
||
Close();
|
||
|
||
//check for a password
|
||
if(m_password.GetLength()>0)
|
||
{
|
||
CString sPassword;
|
||
sPassword.Format(_T(";PWD=%s"),m_password);
|
||
optStr+=sPassword;
|
||
}
|
||
|
||
//create the CDaoDatabase object
|
||
m_database = new CDaoDatabase(NULL);
|
||
|
||
//try and open the database object, on failure set the error number
|
||
try{
|
||
m_database->Open(database,FALSE,FALSE,optStr);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(0);
|
||
return FALSE;
|
||
}
|
||
|
||
if(table == NULL && sql == NULL){
|
||
SetErrorCode(1);
|
||
return FALSE;
|
||
}
|
||
|
||
//if the sql statement is NULL then create and open a CDaoTableDef
|
||
//on failure set the error number
|
||
if(sql == NULL){
|
||
|
||
m_tableDef = new CDaoTableDef(m_database);
|
||
|
||
try{
|
||
m_tableDef->Open(table);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(2);
|
||
return FALSE;
|
||
}
|
||
|
||
//create and open the CDaoRecordset object, on failure set the error number
|
||
m_recordSet = new CDaoRecordset(m_database);
|
||
|
||
try{
|
||
m_recordSet->Open(m_tableDef,openType,options);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(3);
|
||
return FALSE;
|
||
}
|
||
|
||
}
|
||
//create and open the CDaoQueryDef object, on failure set the error number
|
||
else{
|
||
|
||
m_queryDef = new CDaoQueryDef(m_database);
|
||
|
||
try{
|
||
m_queryDef->Create(NULL,sql);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(4);
|
||
return FALSE;
|
||
}
|
||
|
||
//create and open the CDaoRecordset object, on failure set the error number
|
||
m_recordSet = new CDaoRecordset(m_database);
|
||
|
||
try{
|
||
if(openType == dbOpenTable)
|
||
openType = dbOpenDynaset;
|
||
|
||
m_recordSet->Open(m_queryDef,openType,options);
|
||
}
|
||
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(5);
|
||
return FALSE;
|
||
}
|
||
|
||
}
|
||
//retrieve all of the field information
|
||
GatherFieldInfo();
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
GatherFieldInfo
|
||
Purpose
|
||
This internal function gathers the meta data
|
||
for the fields once a recordset is opened.
|
||
The information gathered can be viewed using
|
||
the 'GetFieldInfo' function
|
||
Params
|
||
none
|
||
Return
|
||
none
|
||
****************************************************/
|
||
void COXDao::GatherFieldInfo(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
int loop;
|
||
int fields = m_recordSet->GetFieldCount();
|
||
|
||
//delete any previous field data
|
||
if(m_fields != NULL)
|
||
delete[] m_fields;
|
||
|
||
//create an array of CDaoFieldInfo objects
|
||
m_fields = new CDaoFieldInfo[fields];
|
||
|
||
//store each fields information
|
||
for(loop=0;loop<fields;loop++)
|
||
m_recordSet->GetFieldInfo(loop,m_fields[loop],AFX_DAO_PRIMARY_INFO );
|
||
}
|
||
|
||
/***************************************************
|
||
Close
|
||
Purpose
|
||
Closes all currently open data objects and
|
||
prepares the class for reuse
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::Close(){
|
||
|
||
//close and delete all field objects
|
||
if(m_fields != NULL){
|
||
delete[] m_fields;
|
||
m_fields = NULL;
|
||
}
|
||
//close and delete all recordset objects
|
||
if(m_recordSet != NULL){
|
||
m_recordSet->Close();
|
||
delete m_recordSet;
|
||
m_recordSet = NULL;
|
||
}
|
||
//close and delete all tabledef objects
|
||
if(m_tableDef != NULL){
|
||
m_tableDef->Close();
|
||
delete m_tableDef;
|
||
m_tableDef = NULL;
|
||
}
|
||
//close and delete all querydef objects
|
||
if(m_queryDef != NULL){
|
||
m_queryDef->Close();
|
||
delete m_queryDef;
|
||
m_queryDef = NULL;
|
||
}
|
||
//close and delete all database objects
|
||
if(m_database != NULL){
|
||
if(m_database->IsOpen())
|
||
m_database->Close();
|
||
delete m_database;
|
||
m_database = NULL;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a short value.
|
||
If the specified field contains a numeric type
|
||
larger than a short the value may be truncated
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - a reference to the variable that will hold the
|
||
retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,short& value){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE)
|
||
return FALSE;
|
||
|
||
//check to see if the data type returned can be converted to a short
|
||
switch(cv.vt){
|
||
case VT_UI1://unsigned char
|
||
value = cv.bVal;
|
||
return TRUE;
|
||
case VT_BOOL://boolean
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I2://short or 16bit integer
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I4://long or 32bit integer
|
||
value = (short)cv.lVal;
|
||
TRACE(_T("COXDao::GetField - Possible Truncation, short=long"));
|
||
return TRUE;
|
||
case VT_R4://float
|
||
value = (short)cv.fltVal;
|
||
TRACE(_T("COXDao::GetField - Possible Truncation, short=float"));
|
||
return TRUE;
|
||
case VT_R8://double
|
||
value = (short)cv.dblVal;
|
||
TRACE(_T("COXDao::GetField - Possible Truncation, short=double"));
|
||
return TRUE;
|
||
}
|
||
|
||
//conversion failed, so set an error code
|
||
SetErrorCode(7);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a short value. conversion
|
||
is automatic for compatible field data types.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - data to set into the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum,short value){
|
||
|
||
//turn the short into a variant
|
||
COleVariant cv(value,VT_I2);
|
||
|
||
//set the variant
|
||
return SetField(fieldNum,cv);
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a BOOL value.
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - a reference to the variable that will hold the
|
||
retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum, BOOL& value){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE)
|
||
return FALSE;
|
||
|
||
//check to see if the data type returned can be converted to a short
|
||
switch(cv.vt){
|
||
case VT_UI1://unsigned char
|
||
value = cv.bVal!=0 ? TRUE : FALSE;
|
||
return TRUE;
|
||
case VT_BOOL://boolean
|
||
value = cv.iVal!=0 ? TRUE : FALSE;
|
||
return TRUE;
|
||
case VT_I2://short or 16bit integer
|
||
value = cv.iVal!=0 ? TRUE : FALSE;
|
||
return TRUE;
|
||
case VT_I4://long or 32bit integer
|
||
value = cv.lVal!=0 ? TRUE : FALSE;
|
||
return TRUE;
|
||
case VT_R4://float
|
||
value = cv.fltVal!=0 ? TRUE : FALSE;
|
||
return TRUE;
|
||
case VT_R8://double
|
||
value = cv.dblVal!=0 ? TRUE : FALSE;
|
||
return TRUE;
|
||
}
|
||
|
||
//conversion failed, so set an error code
|
||
SetErrorCode(7);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a BOOL value. conversion
|
||
is automatic for compatible field data types.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - data to set into the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum, BOOL value){
|
||
|
||
//turn the short into a variant
|
||
COleVariant cv((BYTE)value);
|
||
|
||
//set the variant
|
||
return SetField(fieldNum,cv);
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a long value.
|
||
If the specified field contains a numeric type
|
||
larger than a short the value may be truncated
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - a reference to the variable that will hold the
|
||
retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,long& value){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE)
|
||
return FALSE;
|
||
|
||
//check to see if the data type returned can be converted to a long
|
||
switch(cv.vt){
|
||
case VT_UI1://unsigned char
|
||
value = cv.bVal;
|
||
return TRUE;
|
||
case VT_BOOL://boolean
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I2://short or 16bit integer
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I4://long or 32bit integer
|
||
value = cv.lVal;
|
||
return TRUE;
|
||
case VT_R4://float
|
||
value = (long)cv.fltVal;
|
||
TRACE(_T("COXDao::GetField - Possible Truncation, long=float"));
|
||
return TRUE;
|
||
case VT_R8://double
|
||
value = (long)cv.dblVal;
|
||
TRACE(_T("COXDao::GetField - Possible Truncation, long=double"));
|
||
return TRUE;
|
||
}
|
||
|
||
//conversion failed, so set an error code
|
||
SetErrorCode(8);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a short long. conversion
|
||
is automatic for compatible field data types.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - data to set into the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum,long value){
|
||
|
||
//turn the long into a variant
|
||
COleVariant cv(value,VT_I4);
|
||
|
||
//set the variant
|
||
return SetField(fieldNum,cv);
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a double value.
|
||
Fields containing smaller numeric data types
|
||
are converted.
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - a reference to the variable that will hold the
|
||
retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,double& value){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE){
|
||
return FALSE;
|
||
}
|
||
|
||
//check to see if the data returned can be converted into a double
|
||
switch(cv.vt){
|
||
case VT_UI1://unsigned char
|
||
value = cv.bVal;
|
||
return TRUE;
|
||
case VT_BOOL://boolean
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I2://short or 16bit integer
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I4://long or 32bit integer
|
||
value = cv.lVal;
|
||
return TRUE;
|
||
case VT_R4://float
|
||
value = cv.fltVal;
|
||
return TRUE;
|
||
case VT_R8://double
|
||
value = cv.dblVal;
|
||
return TRUE;
|
||
}
|
||
|
||
//conversion failed, so set an error code
|
||
SetErrorCode(9);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a short double. conversion
|
||
is automatic for compatible field data types.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - data to set into the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum,double value){
|
||
|
||
//change the double into a variant
|
||
COleVariant cv(value);
|
||
|
||
//set the variant into the field
|
||
return SetField(fieldNum,cv);
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a double value.
|
||
Fields containing smaller numeric data types
|
||
are converted.
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - a reference to the variable that will hold the
|
||
retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,float& value){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE){
|
||
return FALSE;
|
||
}
|
||
|
||
//check to see if the data returned can be converted into a float
|
||
switch(cv.vt){
|
||
case VT_UI1://unsigned char
|
||
value = cv.bVal;
|
||
return TRUE;
|
||
case VT_BOOL://boolean
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I2://short or 16bit integer
|
||
value = cv.iVal;
|
||
return TRUE;
|
||
case VT_I4://long or 32bit integer
|
||
value = (float)cv.lVal;
|
||
TRACE(_T("COXDao::GetField - Possible Truncation, float=long"));
|
||
return TRUE;
|
||
case VT_R4://float
|
||
value = cv.fltVal;
|
||
return TRUE;
|
||
case VT_R8://double
|
||
value = (float)cv.dblVal;
|
||
TRACE(_T("COXDao::GetField - Possible Truncation, float=double"));
|
||
return TRUE;
|
||
}
|
||
|
||
//conversion failed, so set an error code
|
||
SetErrorCode(9);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a float. conversion
|
||
is automatic for compatible field data types.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
value - data to set into the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum, float value){
|
||
|
||
//change the double into a variant
|
||
COleVariant cv(value);
|
||
|
||
//set the variant into the field
|
||
return SetField(fieldNum,cv);
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a
|
||
COleDataTime object. If the field specified
|
||
is not a date type then the function will fail.
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
var - a reference to the COleDataTime object that will
|
||
hold the retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,COleDateTime& var){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE){
|
||
return FALSE;
|
||
}
|
||
|
||
//change the variant into a COleDataTime object
|
||
var = cv;
|
||
|
||
//check to see if the conversion was successful
|
||
if(var.GetStatus() == var.invalid)
|
||
return FALSE;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field using a
|
||
COleDataTime object. If the field specified
|
||
is not a date type then the function will fail.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
var - a COleDataTime object that will be set into
|
||
the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum,COleDateTime value){
|
||
|
||
//change the datatime object into a variant
|
||
COleVariant cv(value);
|
||
|
||
//set the variant
|
||
return SetField(fieldNum,cv);
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a
|
||
COleCurrency object. If the field specified
|
||
is not a currency then the function will fail.
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
var - a reference to the COleCurrency object that will
|
||
hold the retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,COleCurrency& var){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE){
|
||
return FALSE;
|
||
}
|
||
|
||
//change the variant into a COleCurrency Object
|
||
var = cv;
|
||
|
||
//check to see if the conversion worked
|
||
if(var.GetStatus() == var.invalid )
|
||
return FALSE;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field using a
|
||
COleCurrency object. If the field specified
|
||
is not a currency type then the function will fail.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
var - a COlecurrency object that will be set into
|
||
the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum,COleCurrency value){
|
||
|
||
//convert the currency into a variant
|
||
COleVariant cv(value);
|
||
|
||
//set the variant
|
||
return SetField(fieldNum,cv);
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a
|
||
COleVariant object. This is the native format
|
||
for all DAO data. All types can be retrieved
|
||
with this type.
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
var - a reference to the COleVariant object that will
|
||
hold the retrieved data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,COleVariant& var){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//check to see that the given fieldNum is witin range
|
||
if(fieldNum < 0 || fieldNum >= m_recordSet->GetFieldCount()){
|
||
SetErrorCode(10);
|
||
return FALSE;
|
||
}
|
||
|
||
//check to see if the current record is past the end
|
||
if(m_recordSet->IsEOF()){
|
||
SetErrorCode(11);
|
||
return FALSE;
|
||
}
|
||
|
||
//try and get the data from the field, on error set the error code
|
||
try{
|
||
var = m_recordSet->GetFieldValue(fieldNum);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(12);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a COleVariant object.
|
||
This is the native format for all DAO data. All
|
||
types can be set with this type.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
var - the COleVariant object that will be used to set
|
||
the specified field
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum,COleVariant var){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//check to see if the specified field is within range
|
||
if(fieldNum < 0 || fieldNum >= m_recordSet->GetFieldCount()){
|
||
SetErrorCode(14);
|
||
return FALSE;
|
||
}
|
||
|
||
//check to see if the specified field can be updated
|
||
if((m_fields[fieldNum].m_lAttributes&dbUpdatableField) ==0){
|
||
SetErrorCode(13);
|
||
return FALSE;
|
||
}
|
||
|
||
//try and set the field value, on error set the error code
|
||
try{
|
||
if(var.vt & VT_EMPTY)
|
||
m_recordSet->SetFieldValueNull(fieldNum);
|
||
else
|
||
m_recordSet->SetFieldValue(fieldNum,var);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(15);
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a string.
|
||
Most data types are automatically converted
|
||
to strings if needed.
|
||
Params
|
||
fieldNum - the number of the field to get (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
str - a reference to string that will hold the retrieved
|
||
data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(int fieldNum,CString &str){
|
||
|
||
COleVariant cv;
|
||
|
||
//get the specified field as a variant
|
||
if(GetField(fieldNum,cv) == FALSE)
|
||
return FALSE;
|
||
|
||
//retrieve the data from the variant
|
||
switch(cv.vt){
|
||
case VT_EMPTY:
|
||
str = "";
|
||
return TRUE;
|
||
case VT_BSTR:
|
||
str = ((TCHAR *)cv.bstrVal);
|
||
return TRUE;
|
||
case VT_UI1:
|
||
str.Format(_T("%d"),cv.bVal);
|
||
return TRUE;
|
||
case VT_I2:
|
||
str.Format(_T("%d"),(int)cv.iVal);
|
||
return TRUE;
|
||
case VT_I4:
|
||
str.Format(_T("%ld"),cv.lVal);
|
||
return TRUE;
|
||
case VT_R4:
|
||
str.Format(_T("%f"),cv.fltVal);
|
||
return TRUE;
|
||
case VT_R8:
|
||
TCHAR buf[64];
|
||
UTBStr::stprintf(buf, 64, _T("%lf"),(double)cv.dblVal);
|
||
str = buf;
|
||
return TRUE;
|
||
case VT_BOOL:
|
||
if(cv.iVal)
|
||
str = "1";
|
||
else
|
||
str = "0";
|
||
return TRUE;
|
||
case VT_CY:{
|
||
COleCurrency cur(cv.cyVal);
|
||
str = cur.Format(LOCALE_NOUSEROVERRIDE,LANG_USER_DEFAULT);
|
||
return TRUE;
|
||
}
|
||
case VT_DATE:{
|
||
COleDateTime dt(cv.date);
|
||
str = dt.Format();
|
||
return TRUE;
|
||
}
|
||
case VT_NULL:
|
||
str = "";
|
||
return TRUE;
|
||
default:
|
||
str = "*unknown*";
|
||
}
|
||
|
||
//if the data could not be converted, set the error code
|
||
SetErrorCode(16);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a string.
|
||
Most data types are automatically converted
|
||
to if needed.
|
||
Params
|
||
fieldNum - the number of the field to set (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
str - the string that will used to set the specified
|
||
field with
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(int fieldNum,LPCTSTR str){
|
||
|
||
//convert the string into a variant
|
||
#ifdef __UNICODE__
|
||
COleVariant cv(str,VT_BSTR);
|
||
#else
|
||
COleVariant cv(str,VT_BSTRT);
|
||
#endif
|
||
|
||
//set the variant
|
||
if(SetField(fieldNum,cv) == FALSE)
|
||
return FALSE;
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
/***************************************************
|
||
GetField
|
||
Purpose
|
||
Retrieves the specified field as a string.
|
||
Most data types are automatically converted
|
||
to strings if needed.
|
||
Params
|
||
fieldName - the name of the field to get
|
||
str - a reference to string that will hold the retrieved
|
||
data
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::GetField(LPCTSTR fieldName,CString& str){
|
||
|
||
//retrieve the field number from the name
|
||
int fieldNum = GetFieldNumber(fieldName);
|
||
if(fieldNum <0)
|
||
return FALSE;
|
||
|
||
//get the field
|
||
return GetField(fieldNum,str);
|
||
}
|
||
|
||
/***************************************************
|
||
SetField
|
||
Purpose
|
||
Sets the specified field as a string.
|
||
Most data types are automatically converted
|
||
to if needed.
|
||
Params
|
||
fieldName - the name of the field to set.
|
||
str - the string that will used to set the specified
|
||
field with
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::SetField(LPCTSTR fieldName,LPCTSTR str){
|
||
|
||
//retrieve the field number from the name
|
||
int fieldNum = GetFieldNumber(fieldName);
|
||
if(fieldNum <0)
|
||
return FALSE;
|
||
|
||
//set the field
|
||
return SetField(fieldNum,str);
|
||
}
|
||
|
||
/***************************************************
|
||
GetNumberRows
|
||
Purpose
|
||
Returns the approximate number of rows in
|
||
the currently opened recordset. This function
|
||
more accuratly indicates the number of records
|
||
accessed.
|
||
Params
|
||
none
|
||
Return
|
||
The number of records found
|
||
****************************************************/
|
||
long COXDao::GetNumberRows(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//check to see if the recordset is empty
|
||
if(m_recordSet->IsEOF() && m_recordSet->IsBOF()){
|
||
return 0;
|
||
}
|
||
|
||
//get the current count
|
||
long num = m_recordSet->GetRecordCount();
|
||
if(num <1)
|
||
num = 1;
|
||
|
||
return num;
|
||
|
||
}
|
||
|
||
/***************************************************
|
||
GetNumberFields
|
||
Purpose
|
||
Returns the number of fields in the current
|
||
recordset
|
||
Params
|
||
none
|
||
Return
|
||
The number of fields
|
||
****************************************************/
|
||
int COXDao::GetNumberFields(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//get the number of fields
|
||
return m_recordSet->GetFieldCount();
|
||
}
|
||
|
||
|
||
/***************************************************
|
||
GetFieldNumber
|
||
Purpose
|
||
Returns the corresponding field number for a
|
||
given field name. A -1 is returned on failure.
|
||
Since this function may be used often a shorter
|
||
macro can be used: GFN(name)
|
||
Params
|
||
name - the name of the field to get the ordinal of
|
||
Return
|
||
returns the field ordinal for the given field name.
|
||
-1 is returned if the field can not be found.
|
||
****************************************************/
|
||
int COXDao::GetFieldNumber(LPCTSTR name){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//get the number of fields
|
||
int numFields = m_recordSet->GetFieldCount();
|
||
|
||
//find the field ordinal by comparing each field
|
||
//string with the given field string
|
||
for(int loop = 0; loop < numFields;loop++){
|
||
//compare the strings
|
||
if(lstrcmp(m_fields[loop].m_strName,name) == 0)
|
||
//return the field ordinal
|
||
return loop;
|
||
}
|
||
|
||
//if a match was not found then set the error code
|
||
SetErrorCode(19);
|
||
|
||
return -1;
|
||
}
|
||
|
||
/***************************************************
|
||
GetFieldName
|
||
Purpose
|
||
Returns the name of a given field ordinal
|
||
Params
|
||
fieldNum - ordinal of the field (0 indexed)
|
||
Return
|
||
constant string containing the field name
|
||
NULL on error , call GetLastError for extended
|
||
information none
|
||
****************************************************/
|
||
LPCTSTR COXDao::GetFieldName(int fieldNum){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//make sure that the given field number is within range
|
||
if(fieldNum < 0 || fieldNum >= m_recordSet->GetFieldCount()){
|
||
//if it is out of range then set the error code
|
||
SetErrorCode(20);
|
||
|
||
return NULL;
|
||
}
|
||
|
||
//return the field name for the given number
|
||
return (LPCTSTR)m_fields[fieldNum].m_strName;
|
||
}
|
||
|
||
/***************************************************
|
||
GetFieldInfo
|
||
Purpose
|
||
Returns a pointer to a CDaoFieldObject for the
|
||
given field.This object contains all of the fields
|
||
meta data
|
||
Params
|
||
fieldNum - the number of the field (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
Return
|
||
none
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
CDaoFieldInfo* COXDao::GetFieldInfo(int fieldNum){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//make sure that the given field number is within range
|
||
if(fieldNum < 0 || fieldNum >= m_recordSet->GetFieldCount()){
|
||
//if it is out of range then set the error code
|
||
SetErrorCode(21);
|
||
|
||
return NULL;
|
||
}
|
||
|
||
//return the CDaoFieldInfo for the given field
|
||
return &m_fields[fieldNum];
|
||
}
|
||
|
||
/***************************************************
|
||
FindFirst
|
||
Purpose
|
||
Finds the first record that matches the given
|
||
string. Many field types are automatically
|
||
converted to string if needed. If a match
|
||
is found then the recordset is moved to the
|
||
record found
|
||
Params
|
||
fieldNum - the number of the field (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
string - string to find.
|
||
Return
|
||
none
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::FindFirst(int fieldNum,CString &string){
|
||
|
||
BOOL result=FALSE;
|
||
CString srch;
|
||
|
||
//create the search string
|
||
/// srch.Format(_T("%s = %s"),m_fields[fieldNum].m_strName,string);
|
||
if (m_fields[fieldNum].m_nType == dbText)
|
||
srch.Format(_T("[%s] = '%s'"),m_fields[fieldNum].m_strName,string);
|
||
else
|
||
srch.Format(_T("[%s] = %s"),m_fields[fieldNum].m_strName,string);
|
||
|
||
//try the search
|
||
try{
|
||
result = m_recordSet->Find(AFX_DAO_FIRST, srch);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(22);
|
||
return FALSE;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/***************************************************
|
||
FindNext
|
||
Purpose
|
||
Finds the next record that matches the given
|
||
string. Many field types are automatically
|
||
converted to string if needed. If a match
|
||
is found then the recordset is moved to the
|
||
record found
|
||
Params
|
||
fieldNum - the number of the field (0 indexed)
|
||
(use GetFieldNumber or GFN to translate field names)
|
||
string - string to find.
|
||
Return
|
||
none
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::FindNext(int fieldNum,CString &string){
|
||
|
||
BOOL result=FALSE;
|
||
CString srch;
|
||
|
||
//create the search string
|
||
//srch.Format(_T("%s = %s"),m_fields[fieldNum].m_strName,string);
|
||
if (m_fields[fieldNum].m_nType == dbText)
|
||
srch.Format(_T("[%s] = '%s'"),m_fields[fieldNum].m_strName,string);
|
||
else
|
||
srch.Format(_T("[%s] = %s"),m_fields[fieldNum].m_strName,string);
|
||
|
||
//try the search
|
||
try{
|
||
result = m_recordSet->Find(AFX_DAO_NEXT, srch);
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(23);
|
||
return FALSE;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/***************************************************
|
||
GetRecordSet
|
||
Purpose
|
||
Returns the pointer to the classes internal
|
||
recordset. This member is exposed so that
|
||
other CDaoRecordset functions may be used.
|
||
Params
|
||
none
|
||
Return
|
||
pointer to the CDaoRecordset object
|
||
NULL if the recordset is not opened
|
||
****************************************************/
|
||
CDaoRecordset* COXDao::GetRecordSet(){
|
||
|
||
return m_recordSet;
|
||
}
|
||
|
||
/***************************************************
|
||
GetDatabase
|
||
Purpose
|
||
Returns the pointer to the classes internal
|
||
recordset. This member is exposed so that
|
||
other CDaoDatabase functions may be used.
|
||
Params
|
||
none
|
||
Return
|
||
pointer to the CDaoDatabase object
|
||
NULL if the database is not opened
|
||
****************************************************/
|
||
CDaoDatabase* COXDao::GetDatabase(){
|
||
|
||
return m_database;
|
||
}
|
||
|
||
/***************************************************
|
||
GetTableDef
|
||
Purpose
|
||
Returns the pointer to the classes internal
|
||
recordset. This member is exposed so that
|
||
other CDaoTableDef functions may be used.
|
||
Params
|
||
none
|
||
Return
|
||
pointer to the CDaoTableDef object
|
||
NULL if the database is not opened
|
||
****************************************************/
|
||
CDaoTableDef* COXDao::GetTableDef(){
|
||
|
||
return m_tableDef;
|
||
}
|
||
|
||
/***************************************************
|
||
GetDaoQueryDef
|
||
Purpose
|
||
Returns the pointer to the classes internal
|
||
recordset. This member is exposed so that
|
||
other CDaoQueryDef functions may be used.
|
||
Params
|
||
none
|
||
Return
|
||
pointer to the CDaoQueryDef object
|
||
NULL if the database is not opened
|
||
****************************************************/
|
||
CDaoQueryDef* COXDao::GetQueryDef(){
|
||
|
||
return m_queryDef;
|
||
}
|
||
|
||
/***************************************************
|
||
MoveFirst
|
||
Purpose
|
||
Moves the recordset to the first record. Use
|
||
IsEOF afterward to determine if a record exists.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::MoveFirst(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and move to the first record, on failure the error code is set
|
||
try{
|
||
m_recordSet->MoveFirst();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(24);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
MoveNext
|
||
Purpose
|
||
Moves the recordset to the next available record.
|
||
Use IsEOF afterward to determine if a record exists.
|
||
This function will fail if the last record is already
|
||
reached.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::MoveNext(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and move to the next record, on failure the error code is set
|
||
try{
|
||
m_recordSet->MoveNext();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(25);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
MovePrev
|
||
Purpose
|
||
Moves the recordset to the previous record.
|
||
This function will fail if the currenct record
|
||
is already at the start of the recordset; Use
|
||
IsBOF to determine this.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::MovePrev(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and move to the previous record, on failure the error code is set
|
||
try{
|
||
m_recordSet->MovePrev();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(26);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
MovePrev
|
||
Purpose
|
||
Moves the recordset to the last record in the
|
||
set.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
****************************************************/
|
||
BOOL COXDao::MoveLast(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and move to the last record, on failure the error code is set
|
||
try{
|
||
m_recordSet->MoveLast();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(27);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
IsEOF
|
||
Purpose
|
||
Use this function to determine if the record
|
||
set is on the last record
|
||
Params
|
||
none
|
||
Return
|
||
TRUE if the recordset is on the last record
|
||
otherwise FALSE
|
||
****************************************************/
|
||
BOOL COXDao::IsEOF(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//check to see if the recordset is at the end
|
||
return m_recordSet->IsEOF();
|
||
}
|
||
|
||
/***************************************************
|
||
IsBOF
|
||
Purpose
|
||
Use this function to determine if the record
|
||
set is on the first record
|
||
Params
|
||
none
|
||
Return
|
||
TRUE if the recordset is on the first record
|
||
otherwise FALSE
|
||
****************************************************/
|
||
BOOL COXDao::IsBOF(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//check to see if the recordset is as the start
|
||
return m_recordSet->IsBOF();
|
||
}
|
||
|
||
/***************************************************
|
||
Update
|
||
Purpose
|
||
Updates the current record. Use the Add or Edit
|
||
functions to initiate the updating process first.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
none
|
||
****************************************************/
|
||
BOOL COXDao::Update(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and finish 'Add' or 'Edit', on failure set the error code
|
||
try{
|
||
m_recordSet->Update();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(28);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
CancelUpdate
|
||
Purpose
|
||
Cancels any pending Add or Edit.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
none
|
||
****************************************************/
|
||
BOOL COXDao::CancelUpdate(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and cancel the 'Add' or 'Edit', on failure set the error code
|
||
try{
|
||
m_recordSet->CancelUpdate();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(29);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
Edit
|
||
Purpose
|
||
Puts the current record into edit mode. Once
|
||
in edit mode the fields can be updated using
|
||
the SetField functions. Once finished call
|
||
Upate to save the changes or CancelUpdate to
|
||
cancel.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
none
|
||
****************************************************/
|
||
BOOL COXDao::Edit(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and start editing the current record, on failure set the error code
|
||
try{
|
||
m_recordSet->Edit();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(30);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
Add
|
||
Purpose
|
||
Starts the process of adding a new record to
|
||
the current record set. Once this function is
|
||
called successfully the fields can be updated
|
||
using the SetField functions. Once finished call
|
||
Upate to finish the changes or CancelUpdate to
|
||
cancel.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
none
|
||
****************************************************/
|
||
BOOL COXDao::Add(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//check to see if appending is allowed
|
||
if(m_recordSet->CanAppend()==0)
|
||
return FALSE;
|
||
|
||
//try and start appending a record, on failure set the error code
|
||
try{
|
||
m_recordSet->AddNew();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(31);
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
Delete
|
||
Purpose
|
||
Deletes the current record. Then moves to the
|
||
next record if possible.
|
||
Params
|
||
none
|
||
Return
|
||
TRUE - success
|
||
FALSE - error, call GetLastError for extended information
|
||
none
|
||
****************************************************/
|
||
BOOL COXDao::Delete(){
|
||
|
||
ASSERT(m_recordSet);
|
||
|
||
//try and delete the current record, on failure set the error code
|
||
try{
|
||
m_recordSet->Delete();
|
||
}
|
||
catch(CMemoryException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
AfxAbort();
|
||
}
|
||
catch(CDaoException* e){
|
||
#ifdef UG_DAO_REPORTERROR
|
||
e->ReportError();
|
||
#endif
|
||
e->Delete();
|
||
SetErrorCode(32);
|
||
return FALSE;
|
||
}
|
||
|
||
try{
|
||
m_recordSet->MoveNext();
|
||
}
|
||
catch(CDaoException* e){
|
||
e->Delete();
|
||
try{
|
||
m_recordSet->MovePrev();
|
||
}
|
||
catch(CDaoException* e){
|
||
e->Delete();
|
||
m_recordSet->MoveFirst();
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/***************************************************
|
||
SetPassword
|
||
Purpose
|
||
Sets the password string that will be used
|
||
during the open process. Passwords should
|
||
only be used if they are needed by the
|
||
database being opened. Use "" if clear
|
||
the password setting.
|
||
Params
|
||
pass - the password to set
|
||
Return
|
||
TRUE - success
|
||
FALSE - failure
|
||
****************************************************/
|
||
BOOL COXDao::SetPassword(LPCTSTR pass){
|
||
|
||
//store the given password
|
||
m_password = pass;
|
||
|
||
return TRUE;
|
||
}
|