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

📄 adodatabase.cpp

📁 随着计算机信息技术的飞速发展
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ADODataBase.cpp: implementation of the CADODataBase class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ADODataBase.h"
#include "Afxwin.h"
#include "Winbase.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define INSTRU_PID 1


//********************************************************//
//                 数据库类的函数                         //
//********************************************************//             




//**************   是非判别函数   *************//
#define ISTRUE(hr) if(hr!=S_OK)return FALSE

//*******************************************************//
//                   初始化和内存释放                    //
//*******************************************************//
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环境出错!"));   //3.0版本只能初始化一次,2.0版本可以多次初始化
	//	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连接对象出错!"));
			return;
		}
		nAdoVer=3;
	}
	else
	{
		hr=::CLSIDFromProgID(ADOCE20RecID,&clsid);//获得ADOCE20的CLSID
		if(hr!=S_OK)
		{
			AfxMessageBox(_T("读取ADOCE的CLSID出错,请检查是否安装了ADOCE!"));
			return;
		}
		hr=::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,IID_Recordset20,(LPVOID *)&pRec);//创建获得一个ADO连接对象指针
		if(hr!=S_OK)
		{
			AfxMessageBox(_T("创建ADO连接对象出错!"));
			return;
		}
		nAdoVer=2;
	}
//	CString str;
//	str.Format(_T("版本%d"),nAdoVer);
//	AfxMessageBox(str);
	pRec->MoveFirst();
	dwIndex=0;
}

CADODataBase::~CADODataBase()
{
	pRec->Close();
	if(pRec!=NULL)
		pRec->Release();
//	if(nAdoVer==3)
//		pConn->Release();
	::CloseHandle(pRec);
	::CoUninitialize();
}

//*******************************************************//
//             创建一个数据库文件 szDBName               //
//*******************************************************//
BOOL CADODataBase::CreateDatabase(CString sDBName)
{
	CString sql;
	sql.Format(_T("CREATE DATABASE '%s' "),sDBName);
	hr=pRec->Open(_variant_t(sql.GetBuffer(0)),_variant_t(_T("")),adOpenDynamic,adLockOptimistic,1);
	if(hr!=S_OK)
	{
		sErrMsg.Format(_T("创建数据库 “%s” 不成功!"),sDBName);
		return FALSE;
	}
	szFileName=sDBName;
	return TRUE;
}

//*******************************************************//
//以字段szFeildName创建数据库文件szDBName的表单szDBName**//
//*******************************************************//
BOOL CADODataBase::CreateTable(CString szTableName,CString szFeildName,CString szDBName)
{
	CString sqlcom;
	sqlcom.Format(_T("CREATE TABLE %s (%s)"),szTableName,szFeildName);
	if(szDBName==_T(""))
		hr=pRec->Open(_variant_t(sqlcom.GetBuffer(0)),_variant_t(szFileName.GetBuffer(0)),adOpenDynamic,adLockOptimistic,1);
	else
		hr=pRec->Open(_variant_t(sqlcom.GetBuffer(0)),_variant_t(szDBName.GetBuffer(0)),adOpenDynamic,adLockOptimistic,1);
	if(hr!=S_OK)
	{
		sErrMsg=_T("在数据库 “ ")+szDBName+_T(" ”中创建表“ ")+szTableName+_T(" ”不成功!");
		return FALSE;
	}
	szFileName=szDBName;
	return TRUE;
}

//*******************************************************//
//        打开数据库文件 szDBName 的表单 szDBName       //
//*******************************************************//
BOOL CADODataBase::OpenTable(CString szDBName, CString szTableName)
{
	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)
	{
	    CString str;
		str.Format(_T("打开数据库“%s”的表“%s”不成功,请检查路径是否正确或表是否存在!"),szDBName,szTableName);
		sErrMsg=str;
		return FALSE;
	}
	sTableName=szTableName;   //表名称
	szFileName=szDBName;      // 数据库名称
	return TRUE;
}
void CADODataBase::CloseTable()
{
	pRec->Close();
/*	if(pRec!=NULL)
		pRec->Release();
	::CloseHandle(pRec);
*/
}

//  插入记录
 BOOL CADODataBase::InsertRecord()
 {

/*	pRec->MoveLast();
 	CString str;
// 	str.Format(_T("INSERT INTO %s (序列号,仪器型号)VALUES (1,'09','户斯阿法发')"),sTableName);
	hr=pRec->Open(_variant_t(TEXT("INSERT INTO 基座稳定性_信息表 (序列号,仪器型号,仪器编号) VALUES (0,'88','dddd','007')")),
				     _variant_t(TEXT("szFileName")),
					adOpenForwardOnly , adLockReadOnly , 1);

		for(int i=0;i<2;i++)
 	{
 		str+=_T(",'");
 		str+=m_values.GetAt(i);
 		str+=_T("'");
 	}
 	str+=_T(")");
//	hr=pRec->Open(_variant_t(str.GetBuffer(0)),_variant_t(szFileName),adOpenDynamic,adLockOptimistic,1);
 	if(hr!=S_OK)
 	{
 		str.Format(_T("数据库“ %s  ”表“%s”插入记录不成功!"),szFileName,sTableName);
 		AfxMessageBox(str,MB_ICONSTOP);
 		return FALSE;
 	}
*/	return TRUE;
 }

//  增加记录 
BOOL CADODataBase::AddNewRecord()
{
	_variant_t vaEmpty;
	ISTRUE(pRec->AddNew(vaEmpty,vaEmpty));
	SetValue();
	ISTRUE(pRec->Update(vaEmpty,vaEmpty));
	return TRUE;
}


//*****  读取第 nIndex 条记录(通过读取 m_values )  ***//
BOOL CADODataBase::ReadRecord(int nIndex)
{
	if(nIndex>=(int)GetRecordNumber())
		return FALSE;
	CString szValue;
	m_values.RemoveAll();
	Fields *pFields;
	Field *pField;
	Field20 *Field20;
	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);
		if(nAdoVer==3)  //ADOCE 2.0  版本
		{
			ISTRUE(pFields->get_Item(_variant_t((long)i),&pField));
			ISTRUE(pField->get_Value(&value));
		}
		else  //ADOCE 2.0  版本
		{
			ISTRUE(pFields->get_Item(_variant_t((long)i),(struct Field**)&Field20));
			ISTRUE(Field20->get_Value(&value));
		}
		VariantInit(&vaEmpty);
		::VariantChangeType(&vaEmpty,&value,0,VT_BSTR);
		if(vaEmpty.vt==VT_BSTR)
		{
			szValue=vaEmpty.bstrVal;
		}
		else
			szValue=_T("");
//		AfxMessageBox(szValue);
		m_values.Add(szValue);
	}
	return TRUE;
}

//读取某个记录(nRecordNum)的某字段(nFieldNum)
BOOL CADODataBase::ReadField(int nRecordNum, int nFiledNum)
{
	if(nRecordNum>=(int)GetRecordNumber())
	{
		sErrMsg.Format(_T("指定的记录号超界!\r\n指定:%d   实际:%d"),nRecordNum,GetRecordNumber());
		return FALSE;
	}
	int RecCnt=0;
	long FldCnt;
	Fields *pFields;
	Field *pField;
	Field20 *Field20;
	pRec->get_Fields(&pFields);
	pFields->get_Count(&FldCnt);
	CString szValue;

	if(nFiledNum<0||nFiledNum>=FldCnt)
	{
		szValue.Format(_T("设置的字段数:%d超限!\r\n字段范围[%2d,%2d]"),nFiledNum,0,FldCnt);
		sErrMsg=szValue;
		return FALSE;
	}
	m_values.RemoveAll();

	_variant_t value;
	_variant_t vaEmpty;
	Move(nRecordNum);
	VariantInit(&value);
	if(nAdoVer==3)  //ADOCE 2.0  版本
	{
		ISTRUE(pFields->get_Item(_variant_t((long)nFiledNum),&pField));
		ISTRUE(pField->get_Value(&value));
	}
	else  //ADOCE 2.0  版本
	{
		ISTRUE(pFields->get_Item(_variant_t((long)nFiledNum),(struct Field**)&Field20));
		ISTRUE(Field20->get_Value(&value));
	}
	VariantInit(&vaEmpty);
	::VariantChangeType(&vaEmpty,&value,0,VT_BSTR);
	if(vaEmpty.vt==VT_BSTR)
	{
		szValue=vaEmpty.bstrVal;
	}
	else
		szValue=_T("");
	m_values.Add(szValue);
	return TRUE;
}

//  读取所有记录某个字段Fld的值
BOOL CADODataBase::ReadAllRecord(int Fld)
{
	int RecCnt=0;
	long FldCnt;
	Fields *pFields;
	Field *pField;
	Field20 *Field20;
	pRec->get_Fields(&pFields);
	pFields->get_Count(&FldCnt);
	CString szValue;

	if(Fld<0||Fld>=FldCnt)
	{
		szValue.Format(_T("设置的字段数:%d超限!\r\n字段范围[%2d,%2d]"),Fld,0,FldCnt);
		sErrMsg=szValue;
		return FALSE;
	}
	m_values.RemoveAll();

	_variant_t value;
	_variant_t vaEmpty;
	for(int i=0;i<(int)GetRecordNumber();i++)
	{
		Move(i);
		VariantInit(&value);
		if(nAdoVer==3)  //ADOCE 2.0  版本
		{
			ISTRUE(pFields->get_Item(_variant_t((long)Fld),&pField));
			ISTRUE(pField->get_Value(&value));
		}
		else  //ADOCE 2.0  版本
		{
			ISTRUE(pFields->get_Item(_variant_t((long)Fld),(struct Field**)&Field20));
			ISTRUE(Field20->get_Value(&value));
		}
		VariantInit(&vaEmpty);
		::VariantChangeType(&vaEmpty,&value,0,VT_BSTR);
		if(vaEmpty.vt==VT_BSTR)
		{
			szValue=vaEmpty.bstrVal;
		}
		else
			szValue=_T("");
		m_values.Add(szValue);
	}
	return TRUE;
}

//*****   修改第 nIndex 条记录(通过改变 m_values ) ***///
BOOL CADODataBase::MotifyRecord(int nIndex)
{
	Move(nIndex);
    BOOL IsRight=SetValue();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -