#include "StdAfx.h"
#include "ado.h"
#include "_cAutoDeletOperate.h"
#include "CommonFunction.h"
#include "_cMyExceptionImpl.h"
#include "taiZhangFormatTrans.h"
using namespace CommonFunction;
_cAutoDeleteOperation::_cAutoDeleteOperation(const CString &MDBPath
,ADOX::_CatalogPtr& catalogPtr,CWnd* OwnerPtr,BOOL &RetBOOL)
:m_MDBPathStr(MDBPath),m_Catalog(catalogPtr),m_OwnerPtr(OwnerPtr)
{
::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
WIN32_FIND_DATA fd;
try
{
HANDLE hFind = FindFirstFile(m_MDBPathStr, &fd);
if(hFind != INVALID_HANDLE_VALUE)
{
//CloseHandle(hFind);
TCHAR pathStr[MAX_PATH];
wsprintf(pathStr, _T("%s"),m_MDBPathStr);
if(DeleteFile(pathStr)==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("删除MDB文件失败!"),m_OwnerPtr));
//return FALSE;
}
}
//::CoInitialize(NULL);
CString StrSql;
StrSql.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;"),m_MDBPathStr);
//WCHAR StrSql[5000];
//wsprintf(StrSql, _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;"), MDBPath);
HRESULT hr = S_OK;
//ADOX::_CatalogPtr pCatalog = NULL;
hr = m_Catalog.CreateInstance(__uuidof (ADOX::Catalog));
if(FAILED(hr))
_com_issue_error(hr);
else
{
m_Catalog->Create(_bstr_t(StrSql)); //Create mdb
_ConnectionPtr cn=m_Catalog->GetActiveConnection();
cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Max Buffer Size"))->PutValue(_variant_t((long)512,VT_I4));//jet4.0会将输入修正到0x100~0x10000之间
cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Recycle Long-Valued Pages"))->PutValue(_variant_t((short)-1,VT_BOOL));
cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Page Timeout"))->PutValue(_variant_t((long)512,VT_I4));//
cn->GetProperties()->GetItem(_variant_t("Jet OLEDB:Flush Transaction Timeout"))->PutValue(_variant_t((long)512,VT_I4));//
//Jet OLEDB:Flush Transaction TimeoutJet OLEDB:Flush Transaction Timeout
}
。。。。。。
_cAutoDeleteOperation::~_cAutoDeleteOperation(void)
{
if(NULL!=m_Catalog)
{
_ConnectionPtr con=m_Catalog->GetActiveConnection();
if(con!=NULL)
{
con->Close();
}
con=NULL;
m_Catalog.Release();
m_Catalog=NULL;
}
CoUninitialize();
。。。。。
#pragma once
#include <memory>
#include <functional>
#import "C:\Program Files (x86)\Common Files\System\ado\msadox.dll" rename_namespace("ADOX") rename("Properties", "PropertiesNew") rename("Property", "PropertyNew")//导入dll先
using namespace ADOX;
class _cAutoDeleteOperation//可以当作一个编程模式,凡是需要释放的操作都可以放在这里
{
public:
//const _cUnpADOCatalog pCatalog;
CWnd* m_OwnerPtr;
const CString &m_MDBPathStr;
ADOX::_CatalogPtr& m_Catalog;
_cAutoDeleteOperation(const CString &MDBPath,ADOX::_CatalogPtr& catalogPtr,CWnd* OwnerPtr,BOOL &RetBOOL);
~_cAutoDeleteOperation(void);
。。。。。。
#pragma once
#include "ado.h"
//#include "boost\smart_ptr.hpp"
//using namespace boost;
class _cDataBaseCommonVar
{
public:
unique_ptr<CADODatabase> m_pDb;
unique_ptr<CADORecordset> pRs,pRs2,pRs3;
//scoped_ptr<CADOCommand> pCmd,pCmd2;
unique_ptr<CADOCommand> m_pCommand;
_cDataBaseCommonVar(CADODatabase* pDb);
~_cDataBaseCommonVar(void);
};
#include "StdAfx.h"
#include "_cDataBaseCommonVar.h"
_cDataBaseCommonVar::_cDataBaseCommonVar(CADODatabase* pDb)
{
m_pDb.reset(pDb);
pRs.reset(new CADORecordset(pDb));
pRs2.reset(new CADORecordset(pDb));
pRs3.reset(new CADORecordset(pDb));
m_pCommand.reset(new CADOCommand);
}
_cDataBaseCommonVar::~_cDataBaseCommonVar(void)
{
pRs->Close();
pRs2->Close();
pRs3->Close();
m_pDb->Close();
}
。。。。。。
操作数据库的实例:
SqlStr.Format(L"select * into CompanyListTB%d from \
[Excel 8.0;HDR=NO;IMEX=1;database=%s].[目录$] \
where [目录$].F1 is not null and \
[目录$].F2 is not null and \
[目录$].F3 is not null and \
[目录$].F4 is not null and \
[目录$].F5 not like '%s其他纳税人other%s'",i,strFileFullPath,_T("%"),_T("%"));//in \'%s\' [Sheet1$].F1,
StrTmp.Format(_T("CompanyListTB%d"),i);
hr=pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr);//不返回recordset的执行sql
if(hr==FALSE)
{
//throw _cMyException(_T("CompanyListTB操作失败!"),0,__LINE__,__FILE__);
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("CompanyListTB操作失败!"),this));
}
。。。
StrTmp.Format(_T("insert into CompanyListTB%d(F1,F2,F3,F4,F5) values('0','其他纳税人','215','其他纳税人other','其他纳税人other')"),i);
hr=pUniq_ptr_DBCommonVar->m_pDb->Execute(StrTmp);//不返回recordset的执行sql
if(hr==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("插入操作失败!"),this));
}
。。。。。。
SqlStr.Format(_T("ALTER TABLE CompanyListTB%d ALTER COLUMN F3 TEXT(20)"),i);
hr=pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr);//不返回recordset的执行sql
if(hr==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("属性修改操作失败!"),this));
}
。。。。。。
SqlStr.Format(_T("ALTER TABLE CompanyListTB%d add COLUMN OrderId COUNTER (1, 1) "),i);
hr=pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr);//不返回recordset的执行sql
if(hr==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("属性操作失败!"),this));
}
。。。。。。
SqlStr.Format(_T("select F5 from CompanyListOfMoBanAllTB0 \
where iif(isnull(F5),0,1)=1 and F5 not like '%s纳税人名称%s' \
and F1 not like '%s序号%s' group by F5 \
having count(F5)>1"),_T("%"),_T("%"),_T("%"),_T("%"));
hr=pUniq_ptr_DBCommonVar->pRs->Open(SqlStr);//不返回recordset的执行sql
if(hr==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("插入操作失败!"),this));
}
。。。。。。
SqlStr3.Format(L"delete from TongYongTongJiOfAllComListTB \
where (IsNumeric([%s])=0 and \
iif(isNull([%s]),0,len([%s]))<12) or \
(iif(isnull([%s]),0,1)=0 or \
[%s] Not Like '[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]')",
strJinEFld,strBianMaFld,strBianMaFld,strRuKuRiQiFld
,strRuKuRiQiFld);//也可以用正则表达式过滤
if(pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr3)==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("数据集合操作失败!"),this));
}
。。。。。。
SqlStr.Format(_T("select count(*) as allRecordCoCount from \
(select distinct %s from TongYongTongJiOfAllComListTB)"),strMingChenFld);
pUniq_ptr_DBCommonVar->m_pDb->m_pConnection->CursorLocation = ADOCG::adUseClient;
_variant_t vRecords;
ADOCG::_RecordsetPtr tmpRS=pUniq_ptr_DBCommonVar->m_pDb->m_pConnection->Execute(_bstr_t(SqlStr), &vRecords, adCmdText);
_variant_t vtFld;
vtFld = tmpRS->Fields->GetItem(_T("allRecordCoCount"))->Value;
m_DistinctAllCoCount=vtFld.lVal;
。。。。。。
SqlStr6.Format(L"Insert into TongYongTongJiOf%s([%s],[%s],[%s],\
[%s],[MonthColumn],[YearColumn],[%s],[%s]) \
select '其他纳税人other','其他纳税人other',[%s],sum([%s]),\
[MonthColumn],%d,CStr(%d)+'-'+CStr([MonthColumn]),[%s] from \
TongYongTongJiOfNot%s \
group by MonthColumn,[%s],[%s]",
strTBNameKeyWord,strMingChenFld,strBianMaFld,
strZhengShouXiangMuFld,strJinEFld,strRuKuRiQiFld,colNameStrArray[9],
strZhengShouXiangMuFld,strJinEFld,
m_TaiZhangYear,m_TaiZhangYear,colNameStrArray[9],strTBNameKeyWord,
colNameStrArray[9],strZhengShouXiangMuFld
);
。。。。。。
SqlStr.Format(_T("CREATE INDEX MingChengIndex3 ON CompanyRecNumTBOf%s (%s) with IGNORE NULL "),
strTBNameKeyWord,strMingChenFld);
if(pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr)==FALSE)//不返回recordset的执行sql
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("INDEX操作失败!"),this));
}
SqlStr.Format(L"CREATE PROC searchCompanyRecNumOf%s(MingChenPara \
TEXT(200)) AS select [%s],[companyRecNum] \
from CompanyRecNumTBOf%s where \
[%s]=MingChenPara order by [%s]",
strTBNameKeyWord,strZhuCeLeiXingFld,strTBNameKeyWord,
strMingChenFld,strZhuCeLeiXingFld);
//pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr);
if(pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr)==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("数据过程操作失败!"),this));
}
SqlStr.Format(L"CREATE PROC searchNaShuiBianMaOf%s(MingChenPara \
TEXT(200)) AS select F1,F4 \
from %s where \
[F5]=MingChenPara",
strTBNameKeyWord,strTBNameKeyWord);
//pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr);
if(pUniq_ptr_DBCommonVar->m_pDb->Execute(SqlStr)==FALSE)
{
BOOST_THROW_EXCEPTION(_cMyExceptionImpl(_T("数据过程操作失败!"),this));
}
。。。。。。
//excel作为数据库有顺序,可以用order by排序导入临时表,也可以top取得前面的几条记录
//数据表没有顺序,但是记录集是有顺序的
//SqlStr.Format(L"select top 15 * from \
// [Excel 8.0;HDR=NO;IMEX=1;database=%s].[Sheet1$] ",m_TongYongTongJiExcelFile);//in \'%s\' [Sheet1$].F1,
//pUniq_ptr_DBCommonVar->pRs->Open(SqlStr);
。。。。。。
shared_ptr< _cOneDBRowOfCompany >pTmpOneRowDataOfCompany;
VARIANT (*pbstr)=NULL;
COleSafeArray saRet;
try{
saRet.Attach(
pUniq_ptr_DBCommonVar->pRs->m_pRecordset->GetRows(iCount,COleVariant((long)adBookmarkCurrent)));
saRet.AccessData((LPVOID*)&pbstr);
。。。。。。
//合并同一公司的同一月的同一征收项目元素
int CompanyNum=outRealLst->m_pSmartList->size();
int flag;
list<shared_ptr< _cListOfOneCompanyDBRows >>::iterator it__cListOfOneCompanyDBRows;
it__cListOfOneCompanyDBRows=outRealLst->m_pSmartList->begin();
for(int i=0;i<CompanyNum;++i,++it__cListOfOneCompanyDBRows)
{
list<shared_ptr< _cOneDBRowOfCompany >>::iterator it__cOneDBRowOfCompany_base_arrow;
list<shared_ptr< _cOneDBRowOfCompany >>::iterator it__cOneDBRowOfCompany_second_arrow;
list<shared_ptr< _cOneDBRowOfCompany >>::iterator it__cOneDBRowOfCompany_second_backup_arrow;
for (it__cOneDBRowOfCompany_base_arrow = (*it__cListOfOneCompanyDBRows)->m_pSmartList->begin();
it__cOneDBRowOfCompany_base_arrow != (*it__cListOfOneCompanyDBRows)->m_pSmartList->end();
++it__cOneDBRowOfCompany_base_arrow)
{
//it__cOneDBRowOfCompany_base_backup_arrow=it__cOneDBRowOfCompany_base_arrow;
flag=0;
int BaseRuKuMonth=(*it__cOneDBRowOfCompany_base_arrow)->RuKuMonth;
//if((*it__cOneDBRowOfCompany_base_arrow)->NaShuiRenMingChen==_T("阿拉善**煤炭有限责任公司")&&BaseRuKuMonth==12)
//{
// int test=0;
//}
CString BaseZhengShouXiangMu=(*it__cOneDBRowOfCompany_base_arrow)->ZhengShouXiangMu;
BOOL bBaseLateFee=(*it__cOneDBRowOfCompany_base_arrow)->IsLateFee;
for (it__cOneDBRowOfCompany_second_arrow = it__cOneDBRowOfCompany_base_arrow,
++it__cOneDBRowOfCompany_second_arrow;
it__cOneDBRowOfCompany_second_arrow !=
(*it__cListOfOneCompanyDBRows)->m_pSmartList->end();
)
{
it__cOneDBRowOfCompany_second_backup_arrow=it__cOneDBRowOfCompany_second_arrow;
if((*it__cOneDBRowOfCompany_second_arrow)->RuKuMonth!=BaseRuKuMonth)
{
++it__cOneDBRowOfCompany_second_arrow;
continue;
}
else{
if(bBaseLateFee==TRUE)
{
if(bBaseLateFee!=(*it__cOneDBRowOfCompany_second_arrow)->IsLateFee)
{
++it__cOneDBRowOfCompany_second_arrow;
continue;
}
if(flag==0)
{
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE=
_T("=")+(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE;
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEComment=
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEComment;
flag=1;
}
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEComment+=
(*it__cOneDBRowOfCompany_second_arrow)->RuKuJinEComment;
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE+=_T("+");
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEValue+=
(*it__cOneDBRowOfCompany_second_arrow)->RuKuJinEValue;
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE+=
(*it__cOneDBRowOfCompany_second_arrow)->RuKuJinE;
(*it__cListOfOneCompanyDBRows)->m_pSmartList
->erase(it__cOneDBRowOfCompany_second_arrow++);
}
else{
if((*it__cOneDBRowOfCompany_second_arrow)->ZhengShouXiangMu!=BaseZhengShouXiangMu||
bBaseLateFee!=(*it__cOneDBRowOfCompany_second_arrow)->IsLateFee)
{
++it__cOneDBRowOfCompany_second_arrow;
continue;
}
else
{
if(flag==0)
{
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE=
_T("=")+(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE;
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEComment=
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEComment;
flag=1;
}
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEComment+=
(*it__cOneDBRowOfCompany_second_arrow)->RuKuJinEComment;
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE+=_T("+");
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinEValue+=
(*it__cOneDBRowOfCompany_second_arrow)->RuKuJinEValue;
(*it__cOneDBRowOfCompany_base_arrow)->RuKuJinE+=
(*it__cOneDBRowOfCompany_second_arrow)->RuKuJinE;
(*it__cListOfOneCompanyDBRows)->m_pSmartList
->erase(it__cOneDBRowOfCompany_second_arrow++);
}
}
}
}
}
}
。。。。。。。
}catch(std::exception &exp)
{
if(pbstr!=NULL)
{
saRet.UnaccessData();
}
pUniq_ptr_DBCommonVar->pRs->Close();
::PostMessage(m_pDialogProgress->m_hWnd,MY_MACRO_WM_USER_THREAD_FINISHED,0,0);
CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
exp.what();
return FALSE;
}
catch(_com_error e)
{
if(pbstr!=NULL)
{
saRet.UnaccessData();
}
pUniq_ptr_DBCommonVar->pRs->Close();
::PostMessage(m_pDialogProgress->m_hWnd,MY_MACRO_WM_USER_THREAD_FINISHED,0,0);
CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
dump_com_error(e);
return FALSE;
}
catch (CException* e)
{
if(pbstr!=NULL)
{
saRet.UnaccessData();
}
pUniq_ptr_DBCommonVar->pRs->Close();
::PostMessage(m_pDialogProgress->m_hWnd,MY_MACRO_WM_USER_THREAD_FINISHED,0,0);
CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
e->ReportError();
//ShowMessageDialog(_T("线程异常类型:CException"),_T("错误!"),this);
return FALSE;
//throw e;
}
catch(...)
{
if(pbstr!=NULL)
{
saRet.UnaccessData();
}
pUniq_ptr_DBCommonVar->pRs->Close();
::PostMessage(m_pDialogProgress->m_hWnd,MY_MACRO_WM_USER_THREAD_FINISHED,0,0);
CloseHandle(m_pDialogProgress->m_hEventModelDlgCreated);
return FALSE;
}
return TRUE;
。。。。。。以上是操作数据库的例子,虽不敢说经典,但执行效率很高,尤其是COleSafeArray的使用,可以一次取出多个记录,批量操作数据。
有兴趣的可以看下,如果你的数据库执行效率不高,可以参考以上语句,相信对于代码的重构,有帮助。