⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adodatabase.cpp

📁 evc编程,使用数据库软件
💻 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 + -