将Excel数据文件导入数据库,如何操作,愿愿。

#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的使用,可以一次取出多个记录,批量操作数据。

有兴趣的可以看下,如果你的数据库执行效率不高,可以参考以上语句,相信对于代码的重构,有帮助。

猜你喜欢

转载自blog.csdn.net/tom_xuzg/article/details/81735187