2012-06-21 41 views
2

我有一个应用程序,在运行时创建一个Jet数据库,并导入〜100k记录,以便我可以利用索引出于性能原因(1分钟对比将近10不使用Jet数据库)。访问“修复”打破了一个稍微复杂的查询

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

“修复”后数据仍然正常,但是我的主输出查询不能在Access中查看,因为它告诉我它不能表示连接,如果我在SQL中查看它,则所需的连接不是那里,并且查询不能再运行。这仍然发生,如果我让它得到“修复”,但不打开该查询,即它是打破查询的“修复”,而不是尝试在Access中查看它的行为。有趣的是,我使用Access GUI查询设计器来构建SQL,因为我的生命太短,无法担心它是疯狂的包围风格,但后来它认为它本身太复杂了?

此外,没有别的东西似乎受到影响,所以我只能假设它是这一个它不喜欢的查询。

这对我来说并不是一个破坏行为,因为我的修复是隐藏MDB并建议用户不要打开它。

但是,我真的很喜欢它,如果数据库可以打开,我不必像这样隐藏它。因此,我的问题是,是否有办法阻止MDB自动“修复”?

谢谢!

+0

应该可以创建一个不需要修复的数据库。也许你可以发布一些代码? – Fionnuala

+0

我创建数据库的代码如下所示,并且我已经测试过,这足以强制修复: Set objCat = CreateObject(“ADOX.Catalog”) objCat.Create ConnectionString() 什么是发生在我身上的是我正在创建一个MDB,但在Access 2007中开放,这就是我所拥有的。这可能是问题吗? – CrazyHorse

+0

什么是ConnectionString()? – Fionnuala

回答

1

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

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

2)使用COM +打开Microsoft Access实例,并让它创建.MDB文件。这个.MDB文件将具有所有必要的表格,并且不需要修复该文件。如果Microsoft Access以这种方式打开需要修复的MDB,它将检查所有QueryDef对象中的无效SQL,并根据需要进行更正。这就是为什么你的“复杂”查询正在打破。

+0

谢谢,这是一个很好的答案。我不能假设所有的用户都可以使用Access,所以不能在2)中实现你的建议,但现在我至少知道是什么原因导致了这个问题,让我放心,我只需要重申如果.MDB曾经打开过,则从我的“复杂”查询中得到SQL。再次感谢 – CrazyHorse