2023年11月23日发(作者:)

MS Access数据库实现自动压缩方式

MS Access数据库在一般情况下,其所占空间将随着数据量的增多而增大,即使在程序

中利用SQL语句根据条件删除记录,数据库的大小也不能自动减小(因为删除操作在物理

上是没有把数据记录删掉,因此数据库大小将不会减小)本方式是实现Access数据库的自

动压缩,实现平台是iFIX组态软件中实现的。

因为AccessiFIXODBC报警记录的存储体,在iFIX运行期间,数据库是按独占

方式访问的,程序中将无法利用Access设置的“修复和压缩数据库”功能。本方式实现的

思路是:首先设置ODBC报警数据库(Access)为“关闭时压缩”选项,然后在程序中把

ODBC报警数据库(Access)复制到另一目录,再利用语句把数据库打开,待设定的时间到

达后(例如五秒钟)就关闭ODBC报警数据库Access最后再把ODBC报警数据库Access

复制到原来的目录,替换原来的数据库文件。

约定:

ODBC报警数据库(Access)文件及存放目录是 "C:"

ODBC报警数据库(Access)文件临时存放目录是:"C:DynamicsMXLAlarmBack"

Access运行程序及存放目录为:"C:Program FilesMicrosoft OfficeOFFICE11

"

下边是实现步骤及图解:

[1] ODBC报警数据库(Access)文件进行设置。

打开数据库文件,单击“工具”—“宏”—“安全性”选项,在“安全级”选项卡

内选择“地”,如下图所示;

单击“工具”—“选项”,在“常规”选项卡内选上“关闭时压缩”选项。如下如所示;

[2] iIFX中添加代码。

VB脚本编辑环境内,在菜单栏上选择“工具”“引用”在对话框内添加对Microsoft

Scripting Runtime”的引用,这是为了在程序中可对文件进行操作;

在脚本最顶端添加两个API函数,用来在程序中实现对Windows窗口的操作,添加的

函数为(可以直接复制粘贴)

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal

lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd

As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any)

编写操作代码:

'代码及说明

Dim hw&, cnt& '存放Windows句柄

'============================================================

Dim srcfile As String '存放数据库原文件

Dim desfile As String '存放数据库临时文件

srcfile = "C:" '设置数据库原文件目录文件地址

Dim Fso As New FileSystemObject '创建 FSO 对象实例

Dim filepath As String

'设置数据库临时文件目录文件地址

desfile = "C:"

'将数据库原文件拷贝至临时文件目录,若存在同名文件则覆盖

le srcfile, desfile, True

'==============================================================

'利用Shell命令把临时数据库文件打开

Shell "C:Program FilesMicrosoft

C:", vbMinimizedNoFocus

'设定时间间隔

start = Timer

'时间间隔摄动为5S

Do While Timer < start + 5

DoEvents

Loop

'5秒时间到达后,关闭数据库临时文件

hw& = FindWindow(vbNullString, "Microsoft Access")'查找Microsoft Access窗体

' hw&不为零则表示找到要关闭的窗体,并发送消息,关闭窗体

If hw& <> 0 Then

cnt& = SendMessage(hw&, &H10, 0, 0&) '关闭窗体

End If

'将临时文件复制到原文件目录,并覆盖原文件

le desfile, srcfile, True

'程序结束

[3] iFIX实现Access数据库的自动压缩,可以利用调度来实现。只需设定触发时间,

利用SQL语句操作数据库删除过期数据记录后,就可调用这段代码实现数据库的自动压缩,

防止Access数据库无限增大。

Dim conn As New tion

tionString = "Provider=.4.0;Data

Source=E:;User Id=;Password=;"

Dim sql As String

sql = "DELETE FROM FIXALARMS"

e sql, , adExecuteNoRecords

Set conn = Nothing