【问题标题】:Access "repair" breaks a slightly complex query访问“修复”中断了一个稍微复杂的查询
【发布时间】:2012-08-29 01:28:09
【问题描述】:

我有一个应用程序在运行时创建一个 Jet 数据库,并导入大约 10 万条记录,以便我可以出于性能原因使用索引(1 分钟而不使用 Jet 数据库时将近 10 分钟)。

数据库是使用 Excel 中的 ADO 可扩展性创建的,一切正常。但是,每当我在 Access 前端打开 MDB 文件时,我的问题就会出现,它会自动开始“修复”数据库。

“修复”后数据仍然正常,但是无法在 Access 中查看我的主要输出查询,因为它告诉我它不能表示连接,如果我随后在 SQL 中查看它,则所需的连接不存在,并且查询不能再运行。如果我让它“修复”但不打开该查询,仍然会发生这种情况,即中断查询的是“修复”,而不是尝试在 Access 中查看它的行为。有趣的是,我使用 Access GUI 查询设计器来构造 SQL,因为我的生命太短了,不用担心它是疯狂的括号样式,但后来它认为它对自己来说太复杂了??

此外,似乎没有其他任何事情受到影响,所以我只能假设这是它不喜欢的一个查询。

这对我来说不是什么大问题,因为我的解决方法是隐藏 MDB,并建议可以看到它的用户不要打开它。

但是,如果可以打开数据库并且不必像那样将其隐藏起来,我真的很喜欢。因此,我的问题是是否有任何方法可以防止 MDB 被自动“修复”?

谢谢!

【问题讨论】:

  • 应该可以创建不需要修复的DB。也许您可以发布一些代码?
  • 我创建数据库的代码如下,我已经测试过,仅此一项就足以强制修复: Set objCat = CreateObject("ADOX.Catalog") objCat.Create ConnectionString( ) 我想到的是,我正在创建一个 MDB,但在 Access 2007 中打开,这就是我所拥有的。这可能是问题所在吗?
  • 对我来说,应该是:objcat.Create "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Z:\Docs\New.accdb;"
  • ConnectionString() 返回 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[FOLDER_PATH][DBName].mdb;
  • 非常感谢您的帮助 - 这是否需要在创建或查询它的计算机上安装 Access 07?我知道 Jet 4 绝对可以在所有机器上使用,但设置可能会有所不同,因为它将在不同的位置使用

标签: ms-access ado jet


【解决方案1】:

Microsoft Access 在打开文件时正在“修复”文件,因为它缺少某些特定于 Microsoft Access 用户界面的表。由于您直接使用带有 Microsoft.ACE.OLEDB.12.0 的 OLEDB 创建了 MDB 文件,因此这些表不存在,必须在 Access 第一次打开 MDB 时创建。有几种方法可以避免这种情况:

1) 将 MDB 命名为 .mdb 以外的名称 - 例如:MyAccessDatabase.mad - 这将阻止 Windows 使用 Microsoft Access 打开文件。

2) 使用 COM+ 打开 Microsoft Access 实例,并让它创建 .MDB 文件。然后,此 .MDB 文件将包含所有必要的表,并且不需要修复该文件。

仅供参考,每当 Microsoft Access 打开需要以这种方式修复的 MDB 时,它都会检查所有 QueryDef 对象中是否存在无效 SQL 并根据需要进行更正。这就是您的“复杂”查询中断的原因。

【讨论】:

  • 谢谢,这是一个很好的答案。我无法假设所有用户都可以使用 Access,因此无法在 2) 中实施您的建议,但现在我至少知道导致问题的原因,它让我放心,我只需要重申如果 .MDB 曾经打开过,我的“复杂”查询中的 SQL。再次感谢
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多