关注于使用常用对象来加快Access 数据库

时间:2023-02-05 04:10:34 作者:九霄 综合材料 收藏本文 下载本文

【导语】“九霄”通过精心收集,向本站投稿了7篇关注于使用常用对象来加快Access 数据库,以下是小编帮大家整理后的关注于使用常用对象来加快Access 数据库,供大家参考借鉴,希望可以帮助到您。

篇1:关注于使用常用对象来加快Access 2007数据库

很多时候我们需要加快Access数据库,这篇文章讲述了使用数据可以怎样使得这个需求更加受到关注。这篇文章还探究了Access 2007 ACCDB一个叫做TempVars的特性。但是首先让我们讨论一些用户场景。

情景一:一个经验丰富的Excel技术人员建立了一个具有众多关联数据表的数据库。他坚信他需要升级到SQL server来加快这个数据库。这个数据库只有20MB大小,但是一些表单非常慢,在许多子表单里有许多标签控件和成百上千的离散字段。此外,使用这个数据库的用户需要每次都翻找记录来找到他们所要找的记录。只要添加一个找到记录框就可以使查找数据快得多。

情景二:一个复杂的数据库开发了六年了,而现在开发人员离开了这家公司。在最近的三年他们除了压缩和修复数据库之外没有做任何事,但是数据库的性能很糟糕。在这个数据库中,一些表格在按压关闭按钮之后需要两分钟才能关闭。而且,一些报表的运行需要一个小时。

情景三:一个大型数据库已经转变为使用SQL Server作为后台;它有250个表格和80个表。在高峰期它的性能是非常缓慢的。

好。那么你可以做些什么?首先我们可以假定慢数据库是一个复杂数据库。因此,如果你想加快每个对象,那么它需要很长时间。这意味着你只可以使用数据库的一部分,而确认数据库中有哪些对象是值得使用的最好方法就像下面讲述的。

访问主要用户来找出哪些表单和报表是缓慢的,并制作一个列表。从这个列表中找出最常用的五个缓慢对象并使用这些。这将告诉你可以做到多大的不同以及它将花费多长时间。

那么让我们看看我们可以怎样找出一个表单或一个报表被使用的频率,然后你可以关注于怎样使这些常用对象来变得快些。

提示:记住,这个数据库可能需要重新设计,所以不要为了加快真需要重新设计的数据库而过多的投入和改变很多有限的细节。

当在Access 2007中使用了表单或报表时进行日志记录

这里有一个日志记录代码解决方案。为了用一个好的Access 2007数据库进行测试,从Access模板(图1)套件下载任务模板,并添加代码“new age”日志记录解决方案。

图1 –Access 2007数据库所包含的一些这篇文章用到的任务

必做: 如果你下载了一个任务数据库模版或下载示例代码,保存ACCDB文件到一个安全的文件中,否则你将受到关闭内容信息框的阻碍。

当你打开任务模板数据库时,四处浏览看一下这个应用程序直到你对这个数据库是怎样工作的有些感觉。这个新的任务模板设计得很好,而且与Outlook 2007有一些巧妙的集成。不管怎样,当你看过之后,点击导航条中向下的箭头(如图2所示),并选择所有的Access对象和对象类型,如图3所示。

图2 –任务模板带来的导航条视图

图3 –对象类型视图–仿效旧的Access数据库容器的对象类型视图

使这个数据库代码可以使用

为了使这个示例代码在你的数据库中使用,你需要导入图4中所示的四个对象到你的数据库中。这个表是数据存储的地方,查询是用来添加日志记录的,宏是你从你的报表或表单中运行的,而模块具有捕捉用于日志信息的代码。

图4 –你需要导入到你Access 2007数据库的对象

添加日志宏到你的表单中

这是你要对你的数据库添加对象日志记录所需要做的所有事情。以设计模式打开你的表单,如图5中所做的。并打开设计条栏上的属性面板,选择On Close事件。从列表中选择“mcrLogUsage.LogForm”。注意,在代码中使用的是Close事件,因为它在这个日志记录代码中要比On Open事件更好。这些是所要做的所有步骤,下一次当你的用户打开这个表单(之后关闭)时,就会在日志中添加一条记录。

图5 –怎样在你的表单和报表中建立日志宏

当你遵循下面的建立指导,那么每次有人打开这个表单时都会有一个日志记录(如图6所示)。

图6 -保存到UserObjects日志表中的数据

添加日志宏到你的报表中

要创建报表的一个日志入口,所要做的和为表单所做的一样。在设计视图中打开报表,显示属性面板,找到Close Event,这一次选择mcrLogUsage.LogReport,

找出某对象被使用了多少次

要找出一个对象被使用了多少次,建立一个具有以下SQL语句的查询。

SELECT ObjectName, ObjectType, Count(OpenTime) AS NoTimes

FROM UserObjectLogs

GROUP BY ObjectName, ObjectType;

如果你运行它,你将得到如下面图7所示的结果。

图7 你的对象使用总计

软件安装总结

这是你找出你最常用的表单和报表所需要的所有东西。然后如果你需要加快一些表单和报表,那么集中于那些最常被使用的。记住,子表单和子报表不会包含进这个日志中。

技术(和兴趣)细节

对Access 2007的许多改进都是旨在制作很好的、可下载的模板(如图1中所示)。因此在宏方面有许多创新来创建可以自由传送VBA代码的数据库模板。使其发生的最重要的一个改变是一个叫做TempVar的新对象。让我们看看在这个数据库中怎样使用TempVar。

在模块logObjects_FXL12中,你将看到提取所关注的最后一个表单或报表并找出用户Windows帐户的代码。然后这些结果将放到3个不同的TempVar中。然后会打开一个使用这些TempVars的查询来插入一个新记录到我们的用户日志表中。

Option Compare Database

Option Explicit

Public Function LogFormUsage

On Error Resume Next

TempVars.Add “ObjectName”, Screen.ActiveForm.Name

TempVars.Add “ObjectType”, “3”

Call LogUsage

Exit Function

End Function

Public Function LogReportUsage()

On Error Resume Next

TempVars.Add “ObjectName”, Screen.ActiveReport.Name

TempVars.Add “ObjectType”, “4”

Call LogUsage

Exit Function

End Function

Public Sub LogUsage()

On Error Resume Next

TempVars.Add “WindowsAccount”, User_FX

DoCmd.SetWarnings False

DoCmd.OpenQuery “qryUpdateLogs”

DoCmd.SetWarnings True

Exit Sub

End Sub

注意:如果你仔细地看了这个代码,你会看到一个叫做User_FX的函数,它提取Windows用户帐户。这个代码在下载的数据库中。

TempVars与全局VBA变量相比较

TempVars在查询和表单控制和宏以及VBA间转移值方面是很方便的。在之前,你只能使用全局变量来做到这些,而且它还只能用于VBA代码。全局变量的问题,是如果VBA代码失败了,那么你将丢失全局变量中的信息。而TempVars比它强大得多。

使用TempVars的查询

在这个数据库中你将发现添加了叫做qryUpdateLogs的查询。它从TempVars获得它的值,如图8所示。TempVars 真的是一个不用使用docmd.RunSQL或CurrentDB.Execute就将复杂的东西放到一个查询中的简单方法。

图8-这显示了TempVars怎样在对象间移动信息

最后,如果你看看图9,你将看到我所建立的两个添加到你表格和报表Close events中的宏。你将看到这些宏存储在一个宏容器中,而且你还将注意到在顶端有两行宏逻辑,用来阻止任何人让宏自己运行,因为在这种情况下这个代码会失败。

图9

篇2::ACCESS数据库中Field对象的caption属性读写数据库教程

文章中打“星号”的地方是要重点注意的,因为笔者在这里曾走过弯路,浪费了一个下午的时间在MSDN中游荡,现在分享给大家

本文章说明如何用VBA读写该属性。 可惜Field对象的CAPTION属性并不是ADO原生对象,而是“可由ADO访问的ACCESS属性”,在帮助文档中介绍了两种访问这个属性的方法,一种利用ADO,一种利用DAO,在这里我直接说出结果,由于在ACCESS2003及以前的版本中Field对象并不是ACCESSObject对象,因而也就没有AccessObjectProperties属性,所以我们也就别想在ADO中去解决这个问题吧,现在给出DAO的代码解决办法

SubSetProperty(dbsTempAsDAO.Field,strNameAsString,_ booTempAsString) DimprpNewAsDAO.Property DimerrLoopAsError 'Attempttosetthespecifiedproperty.

OnErrorGoToErr_Property dbsTemp.Properties(strName)=booTemp OnErrorGoTo0 ExitSub Err_Property:

'Error3270meansthatthepropertywasnotfound. IfDBEngine.Errors(0).Number=3270Then

'Createproperty,setitsvalue,andappendittothe 'Propertiescollection.

SetprpNew=dbsTemp.CreateProperty(strName,_ dbText,booTemp)

dbsTemp.Properties.AppendprpNew ResumeNext Else

'Ifdifferenterrorhasoccurred,displaymessage. ForEacherrLoopInDBEngine.Errors

MsgBox“Errornumber:”&errLoop.Number&VBCr&_ errLoop.Description NexterrLoop End EndIf

EndSub SubDisplayClumCaption(ByValtbnameAsString,ByValfldIndexAsInteger)

DimdsetAsDAO.TableDef) //*****必须使用TableDef对象

DimiAsIntegerDimtmpPropAsDAO.Property //强制使用DAO类型

DimfldAsDAO.Field //强制使用DAO类型DimtmpTxtAsString'OnErrorResumeNext

DimmsgAsStringDimcdbAsDAO.Database //*****强制使用DAO类型

Setcdb=CurrentDb //****关键,确定对当前数据库的静态引用

Setdset=cdb.TableDefs(tbname)//*****必须使用TableDef对象

ForEachfldIndset.Fields tmpTxt=fld.Name SetPropertyfld,“Caption”,tmpTxt msg=msg fld.Properties(“Caption”)

msg=msg Chr(10) Chr(13) Nextfld MsgBoxmsgEndSub

这里代码中有两个SUB,一个是SetProperty,用来判断一个字段是否有指定的属性,如果没有设置,有就将相应的数值赋给该属性,这段代码几乎完全是照搬MS的帮助文档,

另一个是DisplayClumCaption,这是对指定表中的字段按字段名设置其CAPTION属性的演示代码。如果有需要,大家可以对SetProperty进行修改,使他变成一个只读的函数,用来枚举指定表中每个字段的CAPTION属性。DisplayClumCaption代码中

篇3:在VB通过vsreport使用ACCESS的报表数据库教程

在VB中也可使用ACCESS的报表

通过vsreport这个控件,你完全可以使用ACCESS来设计好报表,然后在VB中调用这些报表,效果与你直接在ACCESS调用报表一样,

在VB通过vsreport使用ACCESS的报表数据库教程

VB的报表一直是它的弱项,在以前很长一段时间我都是使用这个方法来做报表的,因为有段时间曾经帮香港的朋友做了几个VB的系统,但他们比较喜欢ACCESS的报表,所以使用这个方法来实现。

不过,这个控件,在有子报表的时间会有一些小问题,通过一些特殊的方法才能解决。不过,总的来说,效果还是不错的,它实际上是产生一些中间格式文件来实现的

在ACCESS中国有网友问及这个问题,所以写点以前用过的经验

篇4:使用一个新的名称来恢复数据库数据库教程

可以通过使用新名称的方式来获得数据库的恢复,这往往能够满足商业的需要,当使用不同名称来恢复数据库的时候,你将不得不设置数据库中每一个文件的新位置。如果你早先不知道数据库中有哪些文件,可以运行RESTORE FILELISTONLY声明来获得数据库文件的数量和名称。运行RESTORE FILELISTONLY可以为你提供文件的信息,比如文件的逻辑名称、物理名称、文件是数据文件还是日志文件等。

接着,执行RESTORE DATABASE声明,包括数据库的新名称、将要存储的文件备份。如果你要处理日志文件,请使用NORECOVERY。

在以下的范例中,我们将建立一个名为MyNwind2_Test的数据库,这一数据库是MyNwind2的复本,MyNwind2文件包含两个文件MyNwind2_data和MyNwind2_log。由于MyNwind2已经存在,MyNwind2_data和MyNwind2_log将被转移到另一个地方,

USE master

GO

现在可以决定文件备份中文件的数量和名称。

RESTORE FILELISTONLY

FROM MyNwind2

最后可以将MyNwind2文件恢复到MyNwind2_Test文件

RESTORE DATABASE MyNwind2_Test

FROM MyNwind2

WITH RECOVERY,

MOVE 'MyNwind2_data' TO 'D:\\MyData\\MyNwind2_Test_data.mdf',

MOVE 'MyNwind2_log' TO 'D:\\MyData\\MyNwind2_Test_log.ldf'

GO

篇5:完美表格:使用表层属性来提高效率数据库教程

建立Access表格的方式能够导致它们性能及可信赖性方面的不同,以下将简单地提出一些方法,让你知道如何有效地运用Access的特性,例如表层属性、数据类型以及索引,让你的表格设计能够达到最为理想的状态。

Access将你最重要的资产——你的数据储存在表格中。而实际上,你在屏幕上所看到的表格仅是一个图像的表现,但你就是使用了这个描述来获悉你的数据库使用情况,并对你的数据做出操作。因此,花费一些时间设置适当的熟悉以及数据类型以适应你的数据是相当重要的。如果表格没有做好,所有其它的东西也会受到影响。

使用表层属性来提高效率

Access的表格提供了一些属性能够用来维护数据。你只需要在表层上设置一次属性,并将绑定对象继承这些设置:

格式:决定Access如何显示数据,

标题:Access会将这个文本显示在一个用于控制的相关表框中。

输入掩码:让用户按照特定的命令或方法输入数据。

默认值:Access能自动地为新的记录将这个值植入到一个控制器中。

描述:表级上的文档。当控制器被关注时,Access会在状态栏上显示这个文本。

有效性规则:设置条件值,在输入时必须符合其设置的值才可被Access所接受。

有效性文本:如果所输入的一个条目不能满足有效性规则的表达,那么Access就会显示的文本信息。使用它就能够提供提示,让你输入合适的数据。

你并不是一直都需要坚持使用这些设置。在表或是报表层中,你可以仅为这个表或报表撤销任何其中的属性。在所有的情况下,你都能节约时间,你的数据也能够从一个对象到另一个对象持续地陈列出来。

篇6:一种简单方便的用户权限管理方法使用菜单来管理用户权限数据库教程

菜单|用户权限

今天刚写完一个权限管理的程序,本来有很多解决方案可以实现,只是当时灵机一现,突然想到用菜单来进行权限分配,因为大部分项目的权限要通过菜单来控制,对于在窗口中要控制的非菜单的控件,控制他们其实也可以用一个隐藏的菜单来对应,这样有不少好处,至少可以在一登陆的时候就把所有权限用菜单的ENABLED为TRUE和FALSE来处理,以后,在需要判断权限时,取权限对应菜单的ENABLED一看便知,不用去数据库里取了!用菜单来进行权限分配的一大好处就是直观,所见即所得,通过点选菜单,使菜单项的CHECDED为TRUE即表示拥有该权限了,为FALSE即为不拥有该权限。这样的方式,我认为编程比较简单,比用TREEVIEW来的简单,尤其PB6。5的TREEVIEW还不带复选框,用TREEVIEW来分配权限也是不方便,用数据窗口形式,或则列表框都可以实现,不过我还是自以为用菜单来分配方便简单,于是决定要这样做了!不敢独享,放在这里,也算是对所以帮助过我的网友致谢!

设计思想:

前提:

权限是按菜单来分配的,一个菜单项对应是一个权限,窗口中要控制的非菜单控件通过隐性菜单项来体现到菜单上,保证一个菜单项对应一个权限。

1,从数据库表里取到用户组(角色或者用户,都一样处理)所具有的权限

2根据这些权限设置菜单,将相应菜单项的CHECKED=TRUE(有权限)

3,

用户在菜单上进行权限设置,要设有权限即设置相应菜单的CHECKED属性为真

反之,则假

4确定用户的选择,遍历菜单将每个菜单项与用户组权限表比较,如果用户权限表里有的权限而在对应菜单里CHECKED=FALSE,则删去此权限,为TRUE则不处理,如果用户权限表中没有的权限而在对应菜单里CHECKED=TRUE,则增加此权限,为FALSE则不处理。

效果图如下

在每个菜单项的CLICKED事件里写

this.checked=not this.checked

在做这个程序的时候,碰见一个最大的问题就是,在点选菜单时,一点击左键菜单就不展开了,要为下一个权限点选的时候,又要重新点开菜单,这样是很麻烦的。所以我想要是在点开菜单的同时,可以点选很多子项菜单,这样就可以只需要展开一次菜单,然后可以给多个子菜单项进行权限设置了。

这可是个大问题啊,问了很多高人。子定义可视类不能以菜单为基类。又不能给菜单定义用户事件来映射到WINDOW消息上。而且菜单只有CLICKED和SELECTED两个事件,菜单调用CLICKED事件后会自动变成不展开状态,SELECTED事件里又不能用KEYDOWN函数来判断是否点击了鼠标右键或着键盘按下了某个键,在这个事件里去触发窗口里自定义事件(这个事件里放了KEYDOWN来判断是否有鼠标右键或其他键盘键按下),也不能遂愿。郁闷了我一天啊!

今天手写累了,先到这,要是大家觉得放在这不会玷污大家的眼睛的话,我会尽快努力把下文写完的,

待续!

篇7:一种简单方便的用户权限管理方法使用菜单来管理用户权限(下)数据库教程

菜单|用户权限

问题有点棘手,于是想到去MSDN上查看有哪些可以用的关于的菜单消息,我找到了两

WM_MENUCHAR,WM_MENUSELECT,WM_MENUCHAR是用来判断当有菜单项被选中时,接收到了来自键盘的按键的时候触发,WM_MENUSELECT是在菜单项选中时触发,于是我试了两个消息,发现在映射到WM_MENUSELECT的用户自定义事件中用KEYDOWN判断用户是否按下键根本没用,现在大家明白了,WM_MENUCHAR就是解决问题的关键所在。

WM_MENUCHAR消息是在当用户选中了某个菜单项时(任一个),只是只要按下键盘上的任一个有效键,通过消息上的CHAR可以看出来,就可以触发该事件了,这样。我可以在选中某个菜单项的时候,在出来这个消息的事件里让这个菜单项的CHECKED属性变化,这样就可以让菜单保持展开状态,实现复选了。

在菜单所在窗口中定义一个用户事件,映射到系统消息PBM_MENUCHAR 叫US_MENUCHAR

在这个事件里写

int li_upper

li_upper=upperbound(myCurMenu.item)

if keydown(keyD!) and li_upper= 0 then //判断D键是否按下和是否还有下一级菜单,但是在这里keydown判断不了是否鼠标右键被按下,是因为这个消息只取键盘按键按下与否的信息,

myCurMenu.checked=not myCurMenu.checked

myCurMenu.enabled=not myCurMenu.enabled

myCurMenu.enabled=not myCurMenu.enabled

end if

myCurMenu是个全局变量,用来存放当前用户选中的菜单项,当然这需要在每个菜单项的SELECTED事件里加上一句

MyCurMenu =this

来获得当前高亮显示的菜单。

当然你也可以用API从WM_MENUCHAR消息带来的菜单句炳等去判断是哪个菜单项按下,我试了,没成功。大家可以自己试!

大致的编码就这么多,比较简单,但是没能实现用鼠标右键点选权限,只能用键盘来控制,还是有那么一点不方便。但是感觉还是比较方便实用的,欢迎大家斧正!谢谢!

(完)

如何通过Access来获取MSSQL数据

Access数据库安全策略之ASP式WEB安全

使用虽然词语来造句

使用屹立来造句

ACCESS数据库向MySQL快速迁移小程序(一)数据库教程

ADO.NET读书笔记系列之DataSet对象数据库教程

使用铺天盖地成语来造句

使用激烈词语来造句

用OMF来简化数据库管理数据库教程

Sybase数据库中存储过程的建立和使用

关注于使用常用对象来加快Access 数据库(整理7篇)

欢迎下载DOC格式的关注于使用常用对象来加快Access 数据库,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档