一直怀疑ADO对内存管理是不是有问题!
先上测试代码,然后说问题吧!//全局
_RecordsetPtr g_Rs;
_ConnectionPtr g_Conn;CADOTest::CADOTest()
{
AfxOleInit(); g_Rs = NULL;
try
{
g_Conn.CreateInstance(__uuidof(Connection));
g_Conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ADOTest.mdb; Persist Security Info=TRUE;","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}CADOTest::~CADOTest()
{
if (NULL != g_Rs)
{
if(adStateClosed != g_Rs->State)
g_Rs->Close();
g_Rs = NULL;
} if (NULL != g_Conn)
{
if (adStateClosed != g_Conn->State)
g_Conn->Close();
g_Conn = NULL;
}
}void CADOTest::InsertData()
{
if(NULL != g_Conn && adStateOpen == g_Conn->State)
{
g_Rs.CreateInstance(__uuidof(Recordset));
_variant_t strSQL;
strSQL.SetString("SELECT TOP 1 * FROM ADOTable");
g_Rs->Open(strSQL,
g_Conn.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText); for(int i = 1;i <= 1000;i++)
{
g_Rs->AddNew();
_variant_t var;
var.SetString("Data");
g_Rs->PutCollect(long(0),&var);
g_Rs->Update();
}
g_Rs.Close();
g_Rs = NULL;
}
}
问题在于每执行一次 InsertData(),内存就涨,然后就不下来了。
不知道哪里有问题。所以只能怀疑ADO将数据放入缓存中,没有释放。
哪位知道问题在哪,多谢赐教!
另外,代码不长,对迎测试!
先上测试代码,然后说问题吧!//全局
_RecordsetPtr g_Rs;
_ConnectionPtr g_Conn;CADOTest::CADOTest()
{
AfxOleInit(); g_Rs = NULL;
try
{
g_Conn.CreateInstance(__uuidof(Connection));
g_Conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ADOTest.mdb; Persist Security Info=TRUE;","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}CADOTest::~CADOTest()
{
if (NULL != g_Rs)
{
if(adStateClosed != g_Rs->State)
g_Rs->Close();
g_Rs = NULL;
} if (NULL != g_Conn)
{
if (adStateClosed != g_Conn->State)
g_Conn->Close();
g_Conn = NULL;
}
}void CADOTest::InsertData()
{
if(NULL != g_Conn && adStateOpen == g_Conn->State)
{
g_Rs.CreateInstance(__uuidof(Recordset));
_variant_t strSQL;
strSQL.SetString("SELECT TOP 1 * FROM ADOTable");
g_Rs->Open(strSQL,
g_Conn.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText); for(int i = 1;i <= 1000;i++)
{
g_Rs->AddNew();
_variant_t var;
var.SetString("Data");
g_Rs->PutCollect(long(0),&var);
g_Rs->Update();
}
g_Rs.Close();
g_Rs = NULL;
}
}
问题在于每执行一次 InsertData(),内存就涨,然后就不下来了。
不知道哪里有问题。所以只能怀疑ADO将数据放入缓存中,没有释放。
哪位知道问题在哪,多谢赐教!
另外,代码不长,对迎测试!
解决方案 »
- 有没有会MFC的,问个小问题
- 求数据库源代码
- 在dll中创建sdi的问题???
- 求购读取AutoCad各版本的DWG、DWF、DXF文件源代码
- 求助:怎样知道程序所在路径???
- dll编程中使用ado技术有什么特别注意的吗?
- 请问再哪里能够得到 2001.7月版的msdn?
- 100分,我们应该怎样最大限度的利用开源代码?(欢迎讨论,共利大家)
- 怎样使得CPropertyPage中的listctrl一开始就默认选中第一行?
- 如何读jpg,bmp文件到CBitmap 或 HBITMAP中
- Win7下所有窗口的边框会填充4像素(加宽)自绘对话框的问题。
- MFC线程,AfxBeginThread,为什么不能调用MFC的Combo-box控件的操作函数啊?
for(int i = 1;i <= 1000;i++)
{
g_Rs->AddNew();
_variant_t var;
var.SetString("Data");
g_Rs->PutCollect(long(0),&var);
g_Rs->Update();
}
g_Rs.Close();
g_Rs = NULL;
应该是g_Rs->Close()吧!
g_Rs = NULL;之前先
g_Conn.Release;
g_Rs.Release;最好是把
g_Conn 和 g_Rs 定义为CADOTest的成员变量.
对是g_Rs->Close();
手打代码,非复制,有误另外,我不想关闭数据库,一直处于连接状态。
大哥,你测过吗
_RecordsetPtr这个智能指针重载了=操作符,=NULL是会自已调用Release;
如果自行先调用Release,再=NULL,等于调用了两次Release,不只是多于,而且在新版本中,会报错的。
Connect对像一样。至于是不是成员对象,这个只是个测试程序,只考虑方便就行。
_variant_t::Clear
See Also
Collapse All Expand All Language Filter: All Language Filter: Multiple Language Filter: Visual Basic Language Filter: C# Language Filter: C++ Language Filter: J# Language Filter: JScript
Visual Basic (Declaration)
Visual Basic (Usage)
C#
C++
J#
JScript Microsoft SpecificClears the encapsulated VARIANT object.
void Clear( );
Res
Calls VariantClear on the encapsulated VARIANT object.END Microsoft Specific
VariantInit(&vtProp);
...
VariantClear(&vtProp);
关于_variant_t 是对VARIANT的封装,它会管理VARIANT相关资源,以下是_variant_t析构时的定义://////////////////////////////////////////////////////////////////////////////////////////
//
// Destructor
//
//////////////////////////////////////////////////////////////////////////////////////////inline _variant_t::~_variant_t() throw()
{
::VariantClear(this);
}csdn的高手们哪去了?
//
inline void _variant_t::Clear()
{
_com_util::CheckError(::VariantClear(this));
}
可以看出 _variant_t 析构时 与Clear函数 都是调用::VariantClear(this)
所以 不是_variant_t的问题
但我不知道ACESS数据库是不是也是这样的,另外我觉得虚拟内存本来就是动态变化的,你应该确定一下内存是不是在一定时间之后只增不降。
涉及数据库不深,只是简单用用,个人估计内存增长原因是随着记录条数的增加,记录集会增大,也就会增加占用的内存,而记录集大小应该是有限制的,所以增长到一定内存就不再增加了。
如果是用command而不是用recordset,也许能解决内存增长的问题,因为command并不返回记录集。
不过SQL语言没学过,尝试用command语言总是出错,程序崩溃,最后人崩溃,不想搞了,就暂时放弃了,让他增长去吧,顶多也就24M,不碍事,等我搞懂了SQL再说