ADO+ACCESS数据库,读录大量数据后,用CTreeCtrl来显示的问题!

时间:2021-05-06 21:42:46
我写VC+ADO+ACCESS写个东东,ACCESS中会存放比较多的数据记录(几千或几万条),读出来后,用CTreeCtrl显示!他们是根树,还是树叉同自己定义的NoteID和ParentID决定的!

我的树的初始化的办法是,先得到NoteiD最大值,然后根据这个值生成一个数姐,用以下代码进行数据库的读取并插入到树中:

while(!m_pRecordset->adoEOF)///读取 {
vNoteID = m_pRecordset->GetCollect("NoteID");
vNoteText = m_pRecordset->GetCollect("NoteText");
vParentID = m_pRecordset->GetCollect("ParentID");
vNoteType = m_pRecordset->GetCollect("NoteType");


//父级项句柄是   hSubItem[vParentID.lVal]
hItem= hSubItem[vParentID.lVal];
item=vNoteID.lVal;

hSubItem[item]=m_wndTreeCtrl.InsertItem((LPCTSTR)(_bstr_t)vNoteText,vNoteType.lVal,vNoteType.lVal,hItem);//插入树叉


问题是,hSubItem[ ]这个数组是根据ACCCESS数据库中数据记录最大ID值生成的,如果这个ID值变得非常大,生成的数组也会非常大,这样影响内存的使用和效率!还有,这个“树”在使用中要经常删除和写入记录,这样的话,这个ID值会越来越大,这个ID值是自动编号的。他每次插入的值都会比前一个ID值大。而就算前面的一些记录被删掉很多,这个ID值也不会变小。 
这样用的时间越长,内存使用的效率就会越差。哪位大哥能帮我解决一下!谢谢了!

9 个解决方案

#1


几万条吗,肯定没有注册表大。
假如是一万,10千*100字节=1M,对内存来说,小意思啦。
对于long型的ID,不必关心它的大小,
至于删除插入,对于固定大小空间的操作,堆会处理好的,
如果你确实需要整理,可以定期的做:
首先计算存储树的所有空间大小,一次动态申请,将树的结点逐一转移,并释放原来的所有结点。

#2


老大!是这样的!
比如:我现在往数据库中存了一万条数据,这时的的数据ID最大值为1,000,在我删除五千条后,再写入五千条,这时的数据还是一万条,但是数据ID最大值就会变成15,000。像这样的操作如果多了的话,不知道这个ID值会变得多大。
初始化树叉的数组是根据这个ID值生成的,如果这个值变成了几百万或更多时,真不知道该怎么办!

#3


How to Minimize Memory Allocations for New TreeView Control 
 (130697) - You can use the new TreeView Common Control to display a hierarchical list of items. This new control is available for Win32-based applications running under Windows NT or Windows 95. Applications typically use this control to display a list of items... 

http://support.microsoft.com/default.aspx?scid=kb;en-us;130697

#4


蒋晟.Net 不错,

#5


如果仅仅是要保存树形结构的数据,我个人建议不如用文件。各种操作都好办。
序列化树的方法可以用“序列化树”作为关键字搜索。

#6


没有必要一次就把所有的数据都读取出来,在展开一个节点的时候再读取

#7


我也不想一次读出所有结点

但是我要搜索树叉,所以不得不一次性读出.

各位老大还有没有其它办法没有啊!谢谢!!!!!!!

#8


up

#9


没办法了???
5555555555~~~

#1


几万条吗,肯定没有注册表大。
假如是一万,10千*100字节=1M,对内存来说,小意思啦。
对于long型的ID,不必关心它的大小,
至于删除插入,对于固定大小空间的操作,堆会处理好的,
如果你确实需要整理,可以定期的做:
首先计算存储树的所有空间大小,一次动态申请,将树的结点逐一转移,并释放原来的所有结点。

#2


老大!是这样的!
比如:我现在往数据库中存了一万条数据,这时的的数据ID最大值为1,000,在我删除五千条后,再写入五千条,这时的数据还是一万条,但是数据ID最大值就会变成15,000。像这样的操作如果多了的话,不知道这个ID值会变得多大。
初始化树叉的数组是根据这个ID值生成的,如果这个值变成了几百万或更多时,真不知道该怎么办!

#3


How to Minimize Memory Allocations for New TreeView Control 
 (130697) - You can use the new TreeView Common Control to display a hierarchical list of items. This new control is available for Win32-based applications running under Windows NT or Windows 95. Applications typically use this control to display a list of items... 

http://support.microsoft.com/default.aspx?scid=kb;en-us;130697

#4


蒋晟.Net 不错,

#5


如果仅仅是要保存树形结构的数据,我个人建议不如用文件。各种操作都好办。
序列化树的方法可以用“序列化树”作为关键字搜索。

#6


没有必要一次就把所有的数据都读取出来,在展开一个节点的时候再读取

#7


我也不想一次读出所有结点

但是我要搜索树叉,所以不得不一次性读出.

各位老大还有没有其它办法没有啊!谢谢!!!!!!!

#8


up

#9


没办法了???
5555555555~~~