重新链接表后重新查询表单
Posted
技术标签:
【中文标题】重新链接表后重新查询表单【英文标题】:Requery form after relinking tables 【发布时间】:2018-12-11 15:54:04 【问题描述】:我正在开发一个 MS-Access 应用程序,其数据位于单独的后端数据库(也称为 MS-Access)中。主表单包含一个打开设置对话框的按钮、一个退出按钮(都在表单标题中)和一个导航控件,其中包含多个选项卡,用于在表单详细信息中显示子表单。设置对话框是一个弹出窗口。在对话框中,用户可以更改后端数据库的路径,如果用户保存设置,所有链接的表将自动重新链接。这一切都很好。
但是,在关闭对话框后,重新查询活动子表单没有任何效果,只有当我关闭并重新打开表单(例如,通过单击不同的选项卡)时,它才会显示来自新(重新链接的数据库)的数据。
我认为这与我重新链接 vba 代码无关。
我尝试直接打开我的子表单并使用链接表管理器,结果相同。点击功能区上的刷新按钮没有任何作用,只有当我更改为设计视图并返回表单视图时,表单中的数据才会更新。
我还尝试了重绘、刷新和重新查询的不同组合,但无济于事。
我在我的代码中广泛使用 requery,它运行良好,但似乎不是在简单地重新连接链接表之后。不同的后端数据库具有完全相同的结构,它们只是重复,删除了一些记录以具有测试用例。
这是怎么回事?
问候奥利弗
【问题讨论】:
通常,在重新链接期间,您不会打开任何绑定表单,否则重新链接可能会失败。所以,关闭所有绑定的表单,重新链接,打开一个绑定的表单 - 将查看当前链接的数据。 感谢您的快速回复。然后我必须更改我的布局,以便设置表单(未绑定)替换主表单。我希望有另一种解决方案。 有几种方法可以管理这个。杰弗里回答中的方法可能是一种,尽管我也没有测试过。 【参考方案1】:谢谢Jeffrey,您的回答为我指明了正确的方向。我不知道SourceObject
property。但是,这是包含实际子窗体的子窗体控件的属性。在我的导航控件的特殊情况下,导航子窗体控件包含在选项卡上定义为NavigationTargetName
的活动子窗体。
所以我的代码如下所示:
' ContentContainer is the NavigationSubform control
srcObjStr = Me.ContentContainer.SourceObject
Me.ContentContainer.SourceObject = ""
UpdatePathes 'Relinking
Me.ContentContainer.SourceObject = srcObjStr
甚至不需要重新查询。很不错。
问候奥利弗
【讨论】:
完美,我唯一要补充的是,如果您在 UpdatePathes 期间发生意外崩溃,当您重新打开数据库时,您的 SourceObject 仍将是“”。因此,最好在打开表单时始终设置它以确保不会导致错误。 好点!当我使用vbWatchdog 时,另一个解决方案是在我的代码中包含ErrEx.Catch
和ErrEx.Finally
块。在 finally 块中,我会将 SourceObject 重置为其初始值。但是,vbWatchdog 不是免费的。
有关 try-catch 的纯 VBA 方法,请查看answer。【参考方案2】:
我认为,如果您使用子表单的 SourceObject 属性而不是绑定它们,您可以在不关闭表单的情况下强制更新。
Form_myForm.mySubForm1.SourceObject = ""
Form_myForm.mySubForm2.SourceObject = ""
运行您的重新链接例程
Form_myForm.mySubForm1.SourceObject = "mySubFormQuery1"
Form_myForm.mySubForm2.SourceObject = "mySubFormQuery2"
Form_myForm.mySubForm1.requery
Form_myForm.mySubForm2.requery
这只是猜测,我从来没有遇到过需要在运行时重新链接的情况,但我认为它应该可以工作。
【讨论】:
以上是关于重新链接表后重新查询表单的主要内容,如果未能解决你的问题,请参考以下文章
重新创建父表后如何在 SQLite 中重新设置表 FOREIGN KEY
python测试开发django-72.删除表后如何重新生成表