2023年11月23日发(作者:)
MS Access数据库实现自动压缩方式
MS Access数据库在一般情况下,其所占空间将随着数据量的增多而增大,即使在程序
中利用SQL语句根据条件删除记录,数据库的大小也不能自动减小(因为删除操作在物理
上是没有把数据记录删掉,因此数据库大小将不会减小)。本方式是实现Access数据库的自
动压缩,实现平台是iFIX组态软件中实现的。
因为Access是iFIX的ODBC报警记录的存储体,在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
发布评论