您的位置:首页办公软件Access → Access数据库过大问题的几种解决方案

Access数据库过大问题的几种解决方案

时间:2010/2/10 10:56:00来源:本站整理作者:我要评论(0)

Access数据库过大问题的几种解决方案:

问题:

1、我的Access数据库里面没存多少数据,为什么体积很大,别人和我存一样的数据为什么只有我的文件体积的1/10。
2、为什么我删除了数据,但是数据库体积没有减小?
3、为什么我存了几张图片到ole字段里面数据库体积就变大,而且变大的速度超过图片的总体积?
4、为什么我的数据库没有几条记录,体积就20多MB
5、每次体积变大后都要手动压缩?有没有办法自动压缩?



回答:

1、2、你只要在Access里面菜单 工具->数据库实用工具 -> 压缩修复数据库 就可以了
原因是:Access在删除记录或者进行其他需要临时数据的操作后,并不物理删除这些无用数据,只有压缩修复数据库的时候才真正删除。就象windows中将文件放进回收站中无法增加可用空间必须清空回收站是一个道理。

如何操作请参考以下 FLASH 动画:
手动压缩修复数据库。
http://access911.net/down/eg/swf/rc.htm
http://access911.net/down/eg/swf/rc.swf

3、手动将文件插入ole字段的文件,实际保存在数据库中时ole引擎会在文件数据的前面增加一段信息,用于让ole引擎处理你放进去的文件,所以体积会变大。

4、请查看一下,你的数据库里面是否有包含ole字段的表,ole字段可以存储体积非常大的文件,导致体积增长很正常。再看一下你的数据库中窗体、报表中有没有嵌入使用图片做背景。Access中的背景图片全部是以bmp图片格式存放的,即使你原先指定的是jpg格式,Access也会自动将文件格式转换为bmp再存放。
无论是背景还是控件,只要有图片,体积就会不正常地增大。还有,如果你的程序设计成运行时会使用大量临时数据,用完了再删除的,也会造成体积暴增。

5、可以设置退出时自动压缩,步骤如下:
菜单 -> 工具 -> 选项 -> 常规关闭时压缩 -> 前面打上勾


以上为转贴,以下为原创。

上面的是几种数据库变大后的解决方案。

我想说的是如何防止数据库变的如此大。

站在程序员的角度来说,所以不一定对各位站长有用。

只是或许可以给各位Asp+Access的程序作者一点小小的建议而已。。

采用多个数据库,而不是一个数据库。
 

可以大概指定一定范围,例如从0到1W使用1号数据库。

1W到2W使用2号数据库。

如何使用?。。

con和rs定义多个。。

con1是一号数据库的,con2是二号数据库的。。

rs1是一号数据库的,rs2是二号数据库的。。

添加:

当数据达到XW条时使用新的conX和rsX。。

修改:

查询要修改的ID号。。去指定是数据库执行操作。

删除:

同修改。

用这个有一个不是很好解决的地方。比如我要查询用户排行,查询积分最大的10个用户。

由于用的多个数据库,而且用的多个rs。。

找到了两种方法,各位依照喜好使用。

第一种:

Next
rsB.MoveNext
Wend
rs.UpdateBatch
End If
'返回合成后的新的记录集
Set UnionRs = rs
End Function
'调用合并函数
Private Sub Command1_Click()
Dim rs As Recordset
Set rs = UnionRs(rsA, rsB) '合并rsA和rsB
Set DataGrid1.DataSource = rs
End Sub

 


第二种:
 

当记录条数很多的时候,用循环的方法确实比较慢,比较快一点的,可以借助临时表来做:
假设你的两个数据库位置为:C:\testA.mdb和C:\testB.mdb
Dim cnA As New ADODB.Connection, cnB As New ADODB.Connection, rs As New ADODB.Recordset
cnA.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TestA.mdb;User Id=admin;Password=;"
cnB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TestB.mdb;User Id=admin;Password=;"
cn.Execute ("select * into temp from tableA") '把tableA的数据插入到临时表temp里(具体的查询数据的语句自己改)
cn1.Execute ("INSERT INTO [C:\testA.mdb].temp SELECT * From tableB") 'tableB的数据追加testA的临时表temp里(具体的查询数据的语句自己改)
rs.Open "temp", cnA, adOpenDynamic, adLockReadOnly, adCmdTable




采用多个相同数据库,访问时随机选择数据库。

这个相对来说方便一点,不过不会减少数据库的体积,而是减少数据库的连接数。

也在一定程度上减轻了数据库的压力。

灵感来自镜像站点的访问。

conn.asp(通常为数据库文件)里面加个随机数。。

例如有10个相同数据库,那么随机小于10的整数就OK。

这样以前一个数据库的压力会分配给10个数据库。

虽然不一定平均。。(如果你算法不错,做到平均也不难)

记得后台要有个克隆数据库的操作选项,当然手工也可以。

OK。写完了。希望对各位程序员有点小小的作用。


期望你们写出更优秀的程序来。谢谢。
 



 

 

以上部分全文转载无修改。前几天采集了一个3万6千数据,但是发现空闲的主机上已经没有数据库空间了,转换为mdb后,产生了一个巨大的网站,现在经常宕机。

总而言之,如果使用access作为网站的数据库,集中生产HTML页面的时候,是很痛苦的。

 

Private Function UnionRs(rsA As Recordset, rsB As Recordset) As Recordset
Dim rs As New Recordset, i%
For i = 0 To rsA.Fields.Count - 1
'设置记录集标题列
rs.Fields.Append rsA.Fields(i).Name, rsA.Fields(i).Type, adFldMayBeNull + adFldIsNullable + adFldUpdatable
Next
'添加rsA到rs
If Not rsA.EOF Then
rsA.MoveFirst
If rs.State = adStateClosed Then rs.Open
While Not rsA.EOF
rs.AddNew
For i = 0 To rs.Fields.Count - 1
rs(i) = rsA(i)
Next
rsA.MoveNext
Wend
rs.UpdateBatch
End If
'添加rsB到rs
If Not rsB.EOF Then
rsB.MoveFirst
If rs.State = adStateClosed Then rs.Open
While Not rsB.EOF
rs.AddNew
For i = 0 To rs.Fields.Count - 1
rs(i) = rsB(i)

相关视频

    没有数据

相关阅读 Access数据库的经验杂谈Access数据库转Excel工作簿的方法如何将access数据库导成为excel表如何使用c#操作ACCESS数据库Access数据库在线压缩的实现Access数据库的存储上限教你在Access数据库中如何使用SQL基于Access数据库的抽奖系统设计

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 Access 2010 的十大优 Access2000如何创建索引Access数据库的存储上限ADO连接Access的几种规范做法Access通用-自动替换数据库中的字符串

人气排行 详解MDB与XLS文件互相转换方法C# Access 读取多级分类 dataset操作Access数据库过大问题的几种解决方案Access 2010 的十大优势如何使用c#操作ACCESS数据库Access数据库支持多少用户同时在线使用MD5加密数据库中的用户密码(一)SQL查找Access中某表是否存在方法