📄 adodata.cpp
字号:
// AdoData.cpp : implementation file
//
#include "stdafx.h"
#include "AdoData.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAdoData
CAdoData::CAdoData()
{
m_bDataOpened = false;//初始化为 假 表示已开始数据库没有打开
m_nTableCnts = 0;
m_strTableName.SetSize(Table_Counts);
CREATEINSTANCE(m_piConnection, Connection);
CREATEINSTANCE(m_piCommand, Command);
for(int i=0;i<Table_Counts;i++)
{
m_bTableOpened[i] = false;
m_pFieldsType[i] = NULL;
CREATEINSTANCE(m_piRecordset[i], Recordset);
}
CTime time = CTime::GetCurrentTime();
CString str;
CString Database;
Database = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
str.Format("E:\\sstar\\%04d-%02d-%02d.mdb",time.GetYear(),time.GetMonth(),time.GetDay());//数据库生成路径
Database+=str;
OpenDatabase(Database);
}
CAdoData::~CAdoData()
{
CloseDatabase();
}
BEGIN_MESSAGE_MAP(CAdoData, CWnd)
//{{AFX_MSG_MAP(CAdoData)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CAdoData::ChangeVariantType(UINT& type)
{
switch(type)
{//转换数据类型定义
case adVarWChar:
case adVarChar:
case adLongVarChar:
type = (DataTypeEnum)VT_BSTR;
break;
case adDBDate:
case adDBTime:
case adDBTimeStamp:
type = (DataTypeEnum)VT_DATE;
break;
}
}
void CAdoData::CloseDatabase()
{
//关闭数据库连接
if(m_bDataOpened)
{
m_piConnection->Close();
m_bDataOpened = false;
}
}
void CAdoData::CloseTable(int nTable)
{
if(m_bTableOpened[nTable])
{
m_piRecordset[nTable]->Close();
m_bTableOpened [nTable]= false;
}
if(m_pFieldsType[nTable])
{
delete [] m_pFieldsType[nTable];//删除动态数组
m_pFieldsType[nTable] = NULL;
}
m_nFieldCount[nTable] = 0;
}
/////////////////////////////////////////////////////////////////////////////
// CAdoData message handlers
void CAdoData::OpenDatabase(CString FileName)
{
CString Database;
m_bDataOpened = false;
m_nTableCnts = 0;
Database = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
Database += FileName;
try{
m_piConnection->ConnectionString = _bstr_t(Database);
m_piConnection->Open( "", "", "", -1 );//change by lf
m_bDataOpened = true;
}
catch( _com_error &e){
_bstr_t bstrSource(e.Source());
_bstr_t bs = _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ")
+ _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ")
+ _bstr_t(e.Description());
m_bDataOpened = false;
MessageBox(bs, bstrSource);
return;
}
GetTablesName();
}
void CAdoData::GetTablesName()
{
CString cName;
_RecordsetPtr pRecordset;
if(!m_bDataOpened)
{
AfxMessageBox("必须首先打开数据库文件");
return;
}
pRecordset = m_piConnection->OpenSchema(adSchemaTables);
while(!pRecordset->EndOfFile)
{
cName = RsITEM_BSTR(pRecordset, "TABLE_TYPE");
if(cName == "TABLE"){
cName = RsITEM_BSTR(pRecordset, "TABLE_NAME");
m_strTableName.SetAt(m_nTableCnts++,cName);
}
pRecordset->MoveNext();
}
if (m_nTableCnts > Table_Counts)
{
cName.Format("不能打开那么多表,最多只能打开%d个记录集",Table_Counts);
AfxMessageBox(cName);
return ;
}
OpenTable();
}
void CAdoData::OpenTable()
{
long lFld=0;
CString strSelected;
COleVariant vNull, vValue, vValue1;
for(int i=0;i < m_nTableCnts;i++)
{
strSelected.Format("select * from %s",m_strTableName.GetAt(i));
try
{
m_piRecordset[i]->Open(_bstr_t(strSelected),
_variant_t((IDispatch*)m_piConnection,true),
adOpenDynamic, adLockOptimistic, adCmdText); //打开纪录集
m_bTableOpened[i] = true;
m_nFieldCount[i] = m_piRecordset[i]->Fields->GetCount();//获得纪录集总列数
m_pFieldsType[i] = new UINT[m_nFieldCount[i]]; //申请数组内存空间
memset(m_pFieldsType[i], 0, m_nFieldCount[i] * sizeof(UINT));
for (lFld = 0; lFld < m_nFieldCount[i]; lFld++){
m_pFieldsType[i][lFld] = m_piRecordset[i]->Fields->Item[lFld]->Type;
ChangeVariantType(m_pFieldsType[i][lFld]);
}
}
catch( _com_error &e){
m_bTableOpened[i] = false;
_bstr_t bstrSource(e.Source());
_bstr_t bs = _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ")
+ _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ")
+ _bstr_t(e.Description());
MessageBox(bs, bstrSource);
return;
}
}
}
void CAdoData::Add(UINT nTable,CString *str)
{
// TODO: Add your control notification handler code here
long i=0,lFld=0;
COleVariant vValue, vValue1;
CFileFind myFile;
CString FileName;
CString Database;
CTime time=CTime::GetCurrentTime();
FileName.Format("E:\\sstar\\%d-%02d-%02d.mdb",time.GetYear(),time.GetMonth(),time.GetDay());
if(!myFile.FindFile(FileName,0))
{
CopyFile("DataBaseDown.mdb",FileName,FALSE);
CloseDatabase();
Database = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
Database += FileName;
OpenDatabase(Database);
}
m_piRecordset[nTable]->AddNew();
for(i=1; i<m_nFieldCount[nTable]; i++)
{
vValue=str[i-1];
if( m_pFieldsType[nTable][i] != VT_BSTR && VariantChangeType(&vValue1, &vValue, 0, m_pFieldsType[nTable][i]) == S_OK )
m_piRecordset[nTable]->Fields->Item[i]->Value = vValue1;
else //如果是备注类型
m_piRecordset[nTable]->Fields->Item[i]->Value = vValue;
}
try{
m_piRecordset[nTable]->Update();
}
catch( _com_error &e){
m_piRecordset[nTable]->CancelUpdate();
_bstr_t bstrSource(e.Source());
_bstr_t bs = _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ")
+ _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ")
+ _bstr_t(e.Description());
MessageBox(bs, bstrSource);
}
str = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -