// MyDB.cpp: implementation of the CAccessDB class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include <windows.h>
#include "AccessDB.h"
#include <io.h>
#ifdef _MYSYSTEMAPI_
#include "psapi.h"
#endif
#pragma warning(disable:4267)
#pragma warning(disable:4995)
#pragma warning(disable:4996)
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAccessDB::CAccessDB(LPCTSTR DBPath,LPCTSTR DBName,int OptFlag,LPCTSTR szDBPwd)
{
CString FullName,TmpName,tmp;
if((AfxGetModuleState()->m_dwVersion)!=0x0601)
{
AfxGetModuleState()->m_dwVersion=0x0601;
AfxDaoInit();
}
m_TableCount=0;
tmp=szDBPwd;
if(!tmp.IsEmpty())
m_szDBPwd=tmp;
if(DBPath!=NULL&&DBName!=NULL)
{
m_DBName=DBName;
m_DBPath=DBPath;
}
FullName.Format(_T("%s\\%s"),DBPath,DBName);
TmpName.Format(_T("%s\\tmp.mdb"),DBPath);
if(OptFlag)
{
SetCurrentDirectory(DBPath);
try
{
if(!m_szDBPwd.IsEmpty())
CDaoWorkspace::CompactDatabase(FullName,TmpName,dbLangGeneral,0,m_szDBPwd);
else
CDaoWorkspace::CompactDatabase(FullName,TmpName,dbLangGeneral,0);
DeleteFile(FullName);
TRY
{
CFile::Rename( TmpName, FullName );
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File " << TmpName << " not found, cause = "
<< e->m_cause << "\n";
#endif
}
END_CATCH
}
catch(CDaoException *e)
{
AfxMessageBox(e->m_pErrorInfo->m_strDescription);
e->Delete();
}
}
}
void CAccessDB::InitVersion()
{
if((AfxGetModuleState()->m_dwVersion)!=0x0601)
{
AfxGetModuleState()->m_dwVersion=0x0601;
AfxDaoInit();
}
}
CAccessDB::~CAccessDB()
{
if(m_DataSet.m_pDatabase!=NULL)
{
if(m_DataSet.m_pDatabase->IsOpen())
m_DataSet.m_pDatabase->Close();
}
if(m_DataSet.IsOpen())
m_DataSet.Close();
if(m_DB.IsOpen())
m_DB.Close();
}
int CAccessDB::ConnectDB(LPCTSTR DsnName)
{
CString path,DSNName;
if(DsnName==NULL)
DSNName.Format(_T("%s"),m_DBName);
else
DSNName.Format(_T("%s"),DsnName);
DSNName.Replace(_T(".mdb"),_T(""));
path.Format(_T("DSN=%s;DBQ=%s\\%s;DEFAULTDIR=D:\\"),
DSNName.GetBuffer(0),
m_DBPath,
m_DBName);
SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,
_T("Microsoft Access Driver (*.mdb)\0"),
path.GetBuffer(0));
return 1;
}
int CAccessDB::OpenDB(LPCTSTR lpszName,LPCTSTR lpPath,BOOL bExclusive,
BOOL bReadOnly,LPCTSTR lpszConnect)
{
int ret=0;
CString ErrMsg;
CString szDBPathName;
if(m_DB.IsOpen())
return 1;
if(lpszName==NULL&&m_DBName.IsEmpty())
return 0;
if(lpszName!=NULL)
{
m_DBName=lpszName;
}
if(lpPath!=NULL)
{
m_DBPath=lpPath;
// SetCurrentDirectory(m_DBPath);
}
if(m_DBName.IsEmpty()||m_DBPath.IsEmpty())
return FALSE;
szDBPathName.Format(_T("%s\\%s"),m_DBPath,m_DBName);
try
{
if(!m_szDBPwd.IsEmpty())
m_DB.Open(szDBPathName,bExclusive,bReadOnly,m_szDBPwd);
else
m_DB.Open(szDBPathName,bExclusive,bReadOnly,lpszConnect);
}
catch(CDaoException *e)
{
ErrMsg.Format(_T("\t%s!\n\t请检查数据库状态是否正常,或连接的用户密码是否正确!"),
e->m_pErrorInfo->m_strDescription);
MessageBox(0,ErrMsg,_T("打开数据库失败"),MB_OK|MB_ICONERROR);
// Delete the incomplete recordset object
ret=e->m_pErrorInfo->m_lErrorCode;
e->Delete();
return ret;
}
return (int)FreshDBInfo();
}
BOOL CAccessDB::CloseDB()
{
if(m_DataSet.IsOpen())
m_DataSet.Close();
m_DB.Close();
return 1;
}
int CAccessDB::ExecSQL(LPCTSTR szSql)
{
if(!IsDBOpen())
{
m_ErrMsg=_T("the DB not open !");
return 0;
}
try
{
m_DB.Execute(szSql);
}
catch(CDaoException * e)
{
int retcode=e->m_pErrorInfo->m_lErrorCode;
m_ErrMsg.Format(_T("SQL=[%s].\nErrMsg=[%s]"),szSql,e->m_pErrorInfo->m_strDescription);
//m_ErrMsg.Replace(_T("\n"),_T(" "));
do{
m_ErrMsg.Replace(_T(" "),_T(" "));
}while(m_ErrMsg.Replace(_T(" "),_T(" "))>0);
do{
m_ErrMsg.Replace(_T("\t"),_T(" "));
}while(m_ErrMsg.Replace(_T(" "),_T(" "))>0);
e->Delete();
if(retcode==3065)
{
}
return 0;
}
return 1;
}
int CAccessDB::GetTableCount()
{
return m_TableCount;
}
int CAccessDB::GetFieldCount(LPCTSTR TbName)
{
CDaoTableDef m_MyTable(&m_DB);
m_MyTable.Open(TbName);
int iCount=m_MyTable.GetFieldCount();
m_MyTable.Close();
return iCount;
}
long CAccessDB::GetRowCount(LPCTSTR TbName)
{
for(int i=0;i<m_TableCount;i++)
{
CDaoTableDefInfo TableInfo;
m_DB.GetTableDefInfo(i,TableInfo,AFX_DAO_ALL_INFO);
if(TableInfo.m_strName.CompareNoCase(TbName))
continue;
else
return TableInfo.m_lRecordCount;
}
return -1;
}
LPCTSTR CAccessDB::Str2Bool(BOOL bFlag)
{
return bFlag ? _T("TRUE") : _T("FALSE");
}
CString CAccessDB::Str2Variant(const COleVariant &var)
{
CString strRet,strTmp;
strRet = _T("Fish");
switch(var.vt)
{
case VT_EMPTY:
case VT_NULL:
strRet=_T("NULL");
break;
case VT_I2:
strRet.Format(_T("%hd"),V_I2(&var));
break;
case VT_I4:
strRet.Format(_T("%d"),V_I4(&var));
break;
case VT_R4:
strRet.Format(_T("%e"),(double)V_R4(&var));
break;
case VT_R8:
// strRet.Format(_T("%e"),V_R8(&var));
strTmp.Format(_T("%.2f"),(double)V_R8(&var));
if(strTmp.Find(_T(".00"))<0)
strRet=strTmp;
else
strRet.Format(_T("%ld"),(LONG)V_R8(&var));
break;
case VT_CY:
strRet=COleCurrency(var).Format();
break;
case VT_DATE:
// strRet=COleDateTime(var).Format(_T("%y-%m-%d"));yy-mm-dd
//yyyy-mm-dd
strRet=COleDateTime(var).Format(_T("%Y-%m-%d"));
break;
case VT_BSTR:
strRet=V_BSTRT(&var);
break;
case VT_DISPATCH:
strRet=_T("VT_DISPATCH");
break;
case VT_ERROR:
strRet=_T("VT_ERROR");
break;
case VT_BOOL:
return Str2Bool(V_BOOL(&var));
case VT_VARIANT:
strRet=_T("VT_VARIANT");
break;
case VT_UNKNOWN:
strRet=_T("VT_UNKNOWN");
break;
case VT_I1:
strRet=_T("VT_I1");
break;
case VT_UI1:
strRet.Format(_T("0x%02hX"),(unsigned short)V_UI1(&var));
break;
case VT_UI2:
strRet=_T("VT_UI2");
break;
case VT_UI4:
strRet=_T("VT_UI4");
break;
case VT_I8:
strRet=_T("VT_I8");
break;
case VT_UI8:
strRet=_T("VT_UI8");
break;
case VT_INT:
strRet=_T("VT_INT");
break;
case VT_UINT:
strRet=_T("VT_UINT");
break;
case VT_VOID:
strRet=_T("VT_VOID");
break;
case VT_HRESULT:
strRet=_T("VT_HRESULT");
break;
case VT_PTR:
strRet=_T("VT_PTR");
break;
case VT_SAFEARRAY:
strRet=_T("VT_SAFEARRAY");
break;
case VT_CARRAY:
strRet=_T("VT_CARRAY");
break;
case VT_USERDEFINED:
strRet=_T("VT_USERDEFINED");
break;
case VT_LPSTR:
strRet=_T("VT_LPSTR");
break;
case VT_LPWSTR:
strRet=_T("VT_LPWSTR");
break;
case VT_FILETIME:
strRet=_T("VT_FILETIME");
break;
case VT_BLOB:
strRet=_T("VT_BLOB");
break;
case VT_STREAM:
strRet=_T("VT_STREAM");
break;
case VT_STORAGE:
strRet=_T("VT_STORAGE");
break;
case VT_STREAMED_OBJECT:
strRet=_T("VT_STREAMED_OBJECT");
break;
case VT_STORED_OBJECT:
strRet=_T("VT_STORED_OBJECT");
break;
case VT_BLOB_OBJECT:
strRet=_T("VT_BLOB_OBJECT");
break;
case VT_CF:
strRet=_T("VT_CF");
break;
case VT_CLSID:
strRet=_T("VT_CLSID");
break;
}
WORD vt=var.vt;
if(vt&VT_ARRAY)
{
vt=vt&~VT_ARRAY;
strRet=_T("Array of ");
}
if(vt&VT_BYREF)
{
vt=vt&~VT_BYREF;
strRet+=_T("Pointer to ");
}
if(vt!=var.vt)
{
switch(vt)
{
case VT_EMPTY:
strRet+=_T("VT_EMPTY");
break;
case VT_NULL:
strRet+=_T("NULL");
bre