📄 adodatabase.cpp
字号:
// AdoDatabase.cpp: implementation of the CAdoDatabase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ADOCE30.h"
#include "AdoDatabase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define ISTRUE(hr) if(hr!=S_OK)return FALSE
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void __stdcall _com_issue_error(HRESULT hr)
{
}
CAdoDatabase::CAdoDatabase()
{
szFileName=_T("");
pConn=NULL;
TCHAR ADOCE30ConnID[]=_T("ADOCE.Connection.3.0");
TCHAR ADOCE30RecID[]=_T("ADOCE.Recordset.3.0");
TCHAR ADOCE20RecID[]=_T("ADOCE.Recordset.1");
hr=::CoInitializeEx(NULL,COINIT_MULTITHREADED);//初始化COM环境
if(hr!=S_OK)
{
AfxMessageBox(_T("初始化COM环境出错!\ninitialize entironment error!"));
return;
}
hr=::CLSIDFromProgID(ADOCE30RecID,&clsid);//获得ADOCE30的CLSID
if(hr==S_OK)
{
hr=::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,IID_Recordset,(LPVOID *)&pRec);//创建获得一个ADO连接对象指针
if(hr!=S_OK)
{
AfxMessageBox(_T("创建ADO连接对象出错!\nCreate ADO Connection object error!"));
return;
}
nAdoVer=3;
}
else
{
hr=::CLSIDFromProgID(ADOCE20RecID,&clsid);//获得ADOCE20的CLSID
if(hr!=S_OK)
{
AfxMessageBox(_T("读取ADOCE的CLSID出错,请检查是否安装了ADOCE!\nRead ADOCE CLSID error,Please inspect whether or not install ADOCE!"));
return;
}
hr=::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,IID_Recordset20,(LPVOID *)&pRec);//创建获得一个ADO连接对象指针
if(hr!=S_OK)
{
AfxMessageBox(_T("创建ADO连接对象出错!\nCreate ADO Connection object error!"));
return;
}
nAdoVer=2;
AfxMessageBox(_T("本程序不支持ADO2.0,请您安装ADO3.0!\nThis Programe do not support ADO2.0,Please install ADO3.0!"));
return;
}
pRec->MoveFirst();
dwIndex=0;
}
CAdoDatabase::~CAdoDatabase()
{
pRec->Close();
if(pRec!=NULL)
pRec->Release();
::CloseHandle(pRec);
::CoUninitialize();
}
///////////////////////////////////////////////////////
///创建一个数据库文件,参数szDBName就是数据库的文件名
//////////////////////////////////////////////////////
BOOL CAdoDatabase::CreateDatabase(CString szDBName)
{
if(nAdoVer!=3)
return FALSE;
CString sqlcom;
sqlcom.Format(_T("CREATE DATABASE %s"),szDBName);
// AfxMessageBox(sqlcom);
hr=pRec->Open(_variant_t(sqlcom),_variant_t(_T("")),adOpenDynamic,adLockOptimistic,1);
if(hr!=S_OK)
return FALSE;
szFileName=szDBName;
return TRUE;
}
////////////////////////////////////////////////////////
////
BOOL CAdoDatabase::CreateTable(CString szTableName,CString szFeildName,CString szDBName)
{
if(nAdoVer!=3)
return FALSE;
CString sqlcom;
sqlcom.Format(_T("CREATE TABLE %s (%s)"),szTableName,szFeildName);
if(szDBName==_T(""))
hr=pRec->Open(_variant_t(sqlcom),_variant_t(szFileName),adOpenDynamic,adLockOptimistic,1);
else
hr=pRec->Open(_variant_t(sqlcom),_variant_t(szDBName),adOpenDynamic,adLockOptimistic,1);
if(hr!=S_OK)
return FALSE;
return TRUE;
}
BOOL CAdoDatabase::OpenTable(CString szDBName, CString szTableName)
{
if(nAdoVer!=3)
return FALSE;
CString sqlcom;
sqlcom.Format(_T("SELECT * FROM %s"),szTableName);
hr=pRec->Open(_variant_t(sqlcom.GetBuffer(0)),_variant_t(szDBName.GetBuffer(0)),adOpenDynamic,adLockOptimistic,1);
if(hr!=S_OK)
return FALSE;
szFileName=szDBName;
return TRUE;
}
BOOL CAdoDatabase::MoveFirst()
{
if(nAdoVer!=3)
return FALSE;
hr=pRec->MoveFirst();
if(hr!=S_OK)
return FALSE;
dwIndex=0;
return TRUE;
}
BOOL CAdoDatabase::MoveLast()
{
if(nAdoVer!=3)
return FALSE;
hr=pRec->MoveLast();
if(hr!=S_OK)
return FALSE;
dwIndex=GetRecordNumber()-1;
return TRUE;
}
BOOL CAdoDatabase::MoveNext()
{
if(nAdoVer!=3)
return FALSE;
hr=pRec->MoveNext();
if(hr!=S_OK)
return FALSE;
dwIndex++;
return TRUE;
}
BOOL CAdoDatabase::MovePrevious()
{
if(nAdoVer!=3)
return FALSE;
hr=pRec->MovePrevious();
if(hr!=S_OK)
return FALSE;
dwIndex--;
return TRUE;
}
BOOL CAdoDatabase::Move(int nIndex)
{
if(nAdoVer!=3)
return FALSE;
pRec->MoveFirst();
for(int i=0;i<nIndex;i++)
pRec->MoveNext();
if(hr!=S_OK)
return FALSE;
dwIndex=nIndex;
return TRUE;
}
DWORD CAdoDatabase::GetRecordNumber()
{
if(nAdoVer!=3)
return FALSE;
long dwCount=0;
pRec->get_RecordCount(&dwCount);
return dwCount;
}
BOOL CAdoDatabase::AddNewRecord()
{
if(nAdoVer!=3)
return FALSE;
int nVaule=m_values.GetSize();
if(nVaule==0)
return TRUE;
_variant_t vaEmpty;
ISTRUE(pRec->AddNew(vaEmpty,vaEmpty));
Fields *pFields;//字段的对象指针
Field *pField;//某个字段的对象指针
VARIANT value;
ISTRUE(pRec->get_Fields(&pFields));//获得字段的对象指针
::VariantInit(&value);
long nItem;
ISTRUE(pFields->get_Count(&nItem));//获得字段的数量
int nCount;
if(nVaule>nItem)
nCount=nItem;
else
nCount=nVaule;
for(int i=0;i<nCount;i++)
{
CString szValue;
szValue=m_values.GetAt(i);
ISTRUE(pFields->get_Item(_variant_t((long)i),&pField));
ISTRUE(pField->put_Value(_variant_t(szValue.GetBuffer(0))));
}
ISTRUE(pRec->Update(vaEmpty,vaEmpty));
// pRec->Update(vaEmpty,vaEmpty);
MoveLast();
m_values.RemoveAll();
return TRUE;
}
BOOL CAdoDatabase::ReadRecord(int nIndex)
{
if(nAdoVer!=3)
return FALSE;
if(nIndex>=(int)GetRecordNumber())
return FALSE;
CString szValue;
m_values.RemoveAll();
Fields *pFields;
Field *pField;
Move(nIndex);
int RecCnt=0;
long FldCnt;
_variant_t value;
_variant_t vaEmpty;
pRec->get_Fields(&pFields);
pFields->get_Count(&FldCnt);
for(int i=0;i<FldCnt;i++)
{
VariantInit(&value);
ISTRUE(pFields->get_Item(_variant_t((long)i),&pField));
ISTRUE(pField->get_Value(&value));
VariantInit(&vaEmpty);
::VariantChangeType(&vaEmpty,&value,0,VT_BSTR);
szValue=vaEmpty.bstrVal;
m_values.Add(szValue);
}
return TRUE;
}
BOOL CAdoDatabase::MotifyRecord(int nIndex)
{
if(nAdoVer!=3)
return FALSE;
int nVaule=m_values.GetSize();
if(nVaule==0)
return TRUE;
Move(nIndex);
Fields *pFields;
Field *pField;
VARIANT value;
_variant_t vaEmpty;
ISTRUE(pRec->get_Fields(&pFields));//获得字段的对象指针
::VariantInit(&value);
long nItem;
ISTRUE(pFields->get_Count(&nItem));//获得字段的数量
int nCount;
if(nVaule>nItem)
nCount=nItem;
else
nCount=nVaule;
for(int i=0;i<nCount;i++)
{
CString szValue;
szValue=m_values.GetAt(i);
ISTRUE(pFields->get_Item(_variant_t((long)i),&pField));
ISTRUE(pField->put_Value(_variant_t(szValue.GetBuffer(0))));
}
ISTRUE(pRec->Update(vaEmpty,vaEmpty));
m_values.RemoveAll();
return TRUE;
}
BOOL CAdoDatabase::DelRecord(int nIndex)
{
if(nAdoVer!=3)
return FALSE;
if(nIndex<0)
return FALSE;
long nCount=GetRecordNumber();
if(nIndex>=nCount)
return FALSE;
if(!Move(nIndex))
return FALSE;
_variant_t vaEmpty;
pRec->Delete(1);
MoveFirst();
pRec->Update(vaEmpty,vaEmpty);
return TRUE;
}
BOOL CAdoDatabase::DeleteDatabase(CString szDBName)
{
if(nAdoVer!=3)
return FALSE;
CString sqlcom;
sqlcom.Format(_T("DROP DATABASE %s"),szDBName);
hr=pRec->Open(_variant_t(sqlcom),_variant_t(_T("")),adOpenDynamic,adLockOptimistic,1);
if(hr!=S_OK)
return FALSE;
return TRUE;
}
void CAdoDatabase::CloseTable()
{
if(szFileName.GetLength()>0)
pRec->Close();
}
bool CAdoDatabase::GetFields()
{
if(nAdoVer!=3)
return FALSE;
m_values.RemoveAll();
_variant_t vaEmpty;
Fields *pFields;//字段的对象指针
Field *pField;//某个字段的对象指针
VARIANT value;
ISTRUE(pRec->get_Fields(&pFields));//获得字段的对象指针
::VariantInit(&value);
long nItem;
BSTR str;
ISTRUE(pFields->get_Count(&nItem));//获得字段的数量
for(int i=0;i<nItem;i++)
{
pFields->get_Item(_variant_t((long)i),&pField);
pField->get_Name(&str);
m_values.Add((CString)str);
}
return true;
}
void CAdoDatabase::DeleteTabAllRecord()
{
if(nAdoVer!=3)
return ;
long nCount=GetRecordNumber();
if(nCount==0)
return ;
_variant_t vaEmpty;
MoveFirst();
for(int i=0;i<nCount;i++)
{
pRec->Delete(i);
// MoveFirst();
}
pRec->Update(vaEmpty,vaEmpty);
}
BOOL CAdoDatabase::DeleteTable(CString tableName)
{
if(nAdoVer!=3)
return FALSE;
CString sqlcom;
sqlcom.Format(_T("DROP TABLE %s"),tableName);
hr=pRec->Open(_variant_t(sqlcom),_variant_t(_T("")),adOpenDynamic,adLockOptimistic,1);
if(hr!=S_OK)
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -