ado access 条目很多 程序崩溃

guduliebao 2008-03-23 07:21:11
我刚修改别人的一个access数据库,用了以下代码(我估计是这部分的问题),数据库条目目前有70多万条,文件大小为110M,执行查询的时候程序崩溃了

我标注*****的部分,有人说存在内存泄露,但是我没有找到解决方法

在我调试的时候,m_pRecordset数据集不大的时候,可以运行;但是m_pRecordset条目非常多的时候,程序立马崩溃。

望高人解释原因(本人刚刚来这里,分不多,见谅)

读取表内数据:
_variant_t var;
CString strName;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
******* strName = (LPCSTR)_bstr_t(var);
m_pRecordset->MoveNext();
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
...全文
101 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
guduliebao 2008-03-26
  • 打赏
  • 举报
回复
问题终于解决,果然如yongyuandeni所言,是由于乱码的问题。

在这里,我首先要感谢csdn给了我这次机会,感谢liuyann , yongyuandeni , edidu ,感谢CCTV......

分数不多,人人有份
liuyann 2008-03-25
  • 打赏
  • 举报
回复

内存泄露

strName = (LPCSTR)_bstr_t(var);

每次都生成了一个cstring object,但你从来没有回收!

比如10个记录,会产生10个 cstring object,但你 strName只指向最后一个。
== 思想重于技巧 ==
guduliebao 2008-03-25
  • 打赏
  • 举报
回复
每一条纪录都只有十几个字节,然后我将strname给了一个control list控件以便显示出来
guduliebao 2008-03-25
  • 打赏
  • 举报
回复
cstring负载过多是什么意思呢,能解释一下吗?
查询的条目确实很多,在条目少的时候不会出现问题
liuyann 2008-03-25
  • 打赏
  • 举报
回复

while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)


strName = _T("");//每次去数据时清空对象


******* strName = (LPCSTR)_bstr_t(var);
m_pRecordset->MoveNext();
    del(strName);
}

不记得 释放object是什么语句了
== 思想重于技巧 ==
guduliebao 2008-03-25
  • 打赏
  • 举报
回复
程序崩溃的时候,报的错误是

Runtime Error!

This application has requested the Runtime to terminate it in an unusual way.

我想是不是因为要进行的字符串匹配的数量太大,CPU计算不过来

注意我的like后面是%xxxx%,两个%
guduliebao 2008-03-25
  • 打赏
  • 举报
回复
我好像找到是那一句出了问题;
我写了这么一句话:

m_pRecordset->open("select * from table where name like '%xxxx%' and addr = 'yyyy'",......
(语法可能不对,不用追究,只是表达这么个意思)

xxxx,yyyy是我输入的查询字段名字,只要执行这句,程序多半出问题

当yyyy范围比较小的时候,还有可能运行正常,要当yyyy范围很大的时候,程序就会崩溃
我说的范围指的是这个字段是yyyy的纪录数
yongyuandeni 2008-03-25
  • 打赏
  • 举报
回复
不是内存泄露的问题,栈中的内存不会泄露的。
可能是从数据库中取出的数据是乱码,导致赋值时程序崩溃!
liuyann 2008-03-25
  • 打赏
  • 举报
回复

[Quote]strName = _T("");//每次去数据时清空对象[/Quote]

这只是把当前对象置为 _T(""), 并未释放对象
== 思想重于技巧 ==
yongyuandeni 2008-03-25
  • 打赏
  • 举报
回复
_variant_t var;
CString strName;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)


strName = _T("");//每次去数据时清空对象



******* strName = (LPCSTR)_bstr_t(var);
m_pRecordset->MoveNext();
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
Edidu 2008-03-24
  • 打赏
  • 举报
回复
你用的是一个CString来装在strName,建议你查一下CString类型的最大长度是多少
因为不懂你用的语言,也不知道 (LPCSTR)_bstr_t(var)是什么意思
但是参照你的描述,我怀疑是strName负载过多,导致崩溃。
liuyann 2008-03-24
  • 打赏
  • 举报
回复

cstring定义在循环外面,会有问题吗?

没问题,你的问题在于产生了许多 CString (LPCSTR)_bstr_t(var)

你可以举一下3条记录的例子吗?
== 思想重于技巧 ==
guduliebao 2008-03-23
  • 打赏
  • 举报
回复
strname 我用了的,但是这个cstring定义在循环外面,会有问题吗?
liuyann 2008-03-23
  • 打赏
  • 举报
回复

strName = (LPCSTR)_bstr_t(var);

没能看懂的程序的逻辑。当不空时,负值给strName后用什么处理?

每次 strName = (LPCSTR)_bstr_t(var); 都会产生一个CString 对象,然后用没有指向这些对象的变量。 估计的确是内存泄露。
== 思想重于技巧 ==

7,712

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧