本帖最后由 rnon637 于 2012-03-08 15:21:04 编辑

解决方案 »

  1.   

    读取的过程也得进行try..catch因为有可能你读不到 GetCollect指定的数据
      

  2.   

    这个也试过了,不行。异常很奇怪,如果我屏蔽上面代码,就一点问题也没有,如果没屏蔽,call stack 每次出现错误的地方都不一样。
      

  3.   

    use umdh to catch real leak
      

  4.   


    class AdoConnection 
    {
    public:
    AdoConnection(void);
    ~AdoConnection(void);
    Result TestConnection(const moxu::TString& connectionString);
    Result Connect(const moxu::TString& connectionString);
    void Disconnect();
    bool IsClosed();

    _RecordsetPtr OpenRecordset(const moxu::TString& sql);
    void CloseRecordset();
    Result Execute(const moxu::TString& sql, bool bTrans=false);

    void BeginTrans()
    {
    _connectionPtr->BeginTrans();
    }
    void CommitTrans()
    {
    _connectionPtr->CommitTrans();
    }
    void RollbackTrans()
    {
    _connectionPtr->RollbackTrans();
    }
    private:
    _ConnectionPtr _connectionPtr;};
      

  5.   


    #include "StdAfx.h"
    #include "AdoConnection.h"AdoConnection::AdoConnection(void) :
    _connectionPtr(NULL)
    {
    }AdoConnection::~AdoConnection(void)
    {
    }Result AdoConnection::TestConnection(const moxu::TString& connectionString)
    {
    Result ret = Connect(connectionString);
    if (ret != RS_OK)
    return ret; Disconnect();
    return RS_OK;

    }Result AdoConnection::Connect(const moxu::TString& connectionString)
    {
    try
    {
    Disconnect();
    _connectionPtr.CreateInstance(__uuidof(Connection));
    _connectionPtr->Open(connectionString.c_str(), "", "", adConnectUnspecified);
    }
    catch(_com_error e)
    {
    //LOG_DEBUG1(_T("GlobalAdoConnection::Connect Error: %s"), connectionString.c_str());
    SQL_ERROR1(e);
    if (_connectionPtr != NULL)
    {
    _connectionPtr.Release();
    _connectionPtr = NULL;
    }
    return RS_OPEN_CONN_ERROR;
    }
    catch(...)
    {
    //LOG_DEBUG1(_T("AdoConnection::Connect Error: %s"), connectionString.c_str());
    if (_connectionPtr != NULL)
    {
    _connectionPtr.Release();
    _connectionPtr = NULL;
    }
    return RS_OPEN_CONN_ERROR;
    }
    return RS_OK;
    }void AdoConnection::Disconnect()
    {
    if (_connectionPtr != NULL)
    {
    try
    {
    _connectionPtr->Close();
    _connectionPtr.Release();
    }
    catch(_com_error e)
    {
    }
    catch(...)
    {
    }
    _connectionPtr = NULL;
    }
    }
    bool AdoConnection::IsClosed()
    {
    try
    {
    if(_connectionPtr == NULL || _connectionPtr->State == adStateClosed)
    {
    if(_connectionPtr != NULL)
    {
    _connectionPtr.Release();
    _connectionPtr = NULL;
    }
    return true;
    }
    }
    catch (...)
    {
    return true;
    }
    return false;
    }_RecordsetPtr AdoConnection::OpenRecordset(const moxu::TString& sql)
    {
    _RecordsetPtr recordsetPtr = NULL;
    try
    {
    LOG_DEBUG1(_T("AdoConnection::OpenRecordset: %s"), sql.c_str());
    recordsetPtr.CreateInstance("ADODB.Recordset");
    recordsetPtr->Open(sql.c_str(),_variant_t((IDispatch*)_connectionPtr, true), adOpenStatic, LockTypeEnum(0x3), adCmdText);
    }
    catch(_com_error e)
    {
    LOG_DEBUG1(_T("AdoConnection::OpenRecordset Error: %s"), sql.c_str());
    SQL_ERROR1(e)
    if(recordsetPtr != NULL)
    {
    recordsetPtr.Release();
    recordsetPtr = NULL;
    }
    _connectionPtr->Close();
    _connectionPtr.Release();
    _connectionPtr = NULL;
    }
    catch(...)
    {
    LOG_DEBUG1(_T("AdoConnection::OpenRecordset Error: %s"), sql.c_str());
    if(recordsetPtr != NULL)
    {
    recordsetPtr.Release();
    recordsetPtr = NULL; }
    _connectionPtr->Close();
    _connectionPtr.Release();
    _connectionPtr = NULL;
    }
    return recordsetPtr;
    }Result AdoConnection::Execute(const moxu::TString& sql, bool bTrans)
    {
    Result ret;
    _variant_t RecordsAffected;
    try
    {
    LOG_DEBUG1(_T("AdoConnection::Execute: %s"), sql.c_str());
    _connectionPtr->Execute(sql.c_str(), &RecordsAffected, adCmdText);
    ret = RecordsAffected.intVal > 0 ? RS_OK : RS_NO_RECORDS_AFFECTED;
    }
    catch(_com_error e)
    {
    if (!bTrans)
    {
    _connectionPtr->Close();
    _connectionPtr.Release();
    _connectionPtr = NULL;
    } LOG_DEBUG1(_T("AdoConnection::Execute Error: %s"), sql.c_str());
    SQL_ERROR1(e)
    return RS_SQL_ERROR;
    }
    catch(...)
    {
    if (!bTrans)
    {
    _connectionPtr->Close();
    _connectionPtr.Release();
    _connectionPtr = NULL;
    } LOG_DEBUG1(_T("AdoConnection::Execute Error: %s"), sql.c_str());
    return RS_SQL_ERROR;
    }
    return ret;
    }
      

  6.   

    moxu::TString是我们自己定义的字符串类型,修改一下就可以了!
      

  7.   


    都是调用底层的api,我的获取那边爆掉了,其他封装是没问题的。