ado使用内存泄露 本帖最后由 rnon637 于 2012-03-08 15:21:04 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 读取的过程也得进行try..catch因为有可能你读不到 GetCollect指定的数据 这个也试过了,不行。异常很奇怪,如果我屏蔽上面代码,就一点问题也没有,如果没屏蔽,call stack 每次出现错误的地方都不一样。 use umdh to catch real leak 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;}; #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;} moxu::TString是我们自己定义的字符串类型,修改一下就可以了! 都是调用底层的api,我的获取那边爆掉了,其他封装是没问题的。 对话框问题,希望VisualEleven和各位高手来指点一二! 关于c++程序员 Debug下Link没错,Release就出错(afxPchNil)? 如何控制菜单的显示区域? 怎样修改窗体的风格? 怎样抛出异常 斑竹请进 使用atl做控件遇到不能使用数学函数的问题 如何实现向数据库中存取图片,并进行操作(插入,删除,修改) 数据库连接在什么函数和连接的方法 wav单双声道转换思路求教。 0xC0000005: 写入位置 0x051800c3 时发生访问冲突,大虾门,这是怎么回事呀
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;};
#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;
}
都是调用底层的api,我的获取那边爆掉了,其他封装是没问题的。