Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16410637
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 14:23:04

下载本文示例代码

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


回答:

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

如何操作请参考以下 FLASH 动画:
手动压缩修复数据库。



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。。

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

第一种:

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)
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

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


回答:

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

如何操作请参考以下 FLASH 动画:
手动压缩修复数据库。



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。。

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

第一种:

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)
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 下载本文示例代码


Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法Access数据库体积过大问题的解决方法
阅读(1010) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~