2012-06-21 39 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