📄 adodatabase.cpp
字号:
// 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 + -