2010-08-03 44 views
4

我試圖壓縮我的Access 2007數據庫是這樣的:如何在我的C#程序中斷開連接?

System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office12\msaccess.exe",@"c:\Mydb.mdb /compact "); 

在我的C#程序,我得到這個錯誤:

You attempted to open a database that is already opened exclusively by user on machine . Try again when the database is available. (Error 3356)

我試圖Conn.close(),但仍然得到錯誤

謝謝提前。

+0

你可以給你一個關於你如何閱讀的高層次? – Nix 2010-08-03 12:35:40

+0

聽起來像你有其他地方打開數據庫(在Access中)?當你的應用程序終止時,它已經關閉了你的連接,但是你的代碼應該總是關閉/處理任何連接。 – 2010-08-03 12:37:48

+1

你可以在你的應用程序之外執行這些命令嗎? – Andrey 2010-08-03 12:38:21

回答

0

檢查您的任務管理器,看看您的Access是否已經打開。如果是這樣,請關閉這些實例並重試。

+0

要尋找什麼?沒有看到訪問任務管理器 – Gold 2010-08-03 13:02:18

+1

您正在查看是否MSAccess.EXE已在運行。在C#中使用Microsoft Office應用程序時,我總是發現,我無法正常退出應用程序,也不會在任務管理器中保留可執行文件。 – 2010-08-03 13:57:52

+0

這不一定是打開文件的MSACCESS.EXE。任何利用Jet的程序都可以打開它。 – 2010-08-04 18:30:09

0

也許出了點問題,你只是有一個額外的* .ldb文件。去你的數據庫存儲的地方:

c:\Mydb.ldb

如果沒有人使用它刪除文件。

+0

感謝您的幫助,但無益 - 同樣的錯誤 – Gold 2010-08-03 13:01:15

0

//編輯開始

查閱這些基本的故障排除項:

http://office.microsoft.com/en-us/access-help/troubleshoot-compacting-repairing-or-recovering-an-access-file-HP005188316.aspx?queryid=728e1007c19b43bba069cb7f11364f7a&respos=0&CTT=1

看看是否有上述原因導致緊湊的失敗!

//編輯結束

查看以下鏈接: http://support.microsoft.com/kb/209207

使用/與代碼以獨佔方式打開它不包括。

因此,代碼如下:

System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office12\msaccess.exe",@"c:\Mydb.mdb /excl /compact "); 

通過使用你將完全打開它不含選擇!

希望它有幫助!

+0

感謝您的幫助,但無益 - 同樣的錯誤 – Gold 2010-08-03 13:00:33

+0

查看故障排除鏈接,看看他們是否有任何問題導致: http://office.microsoft.com/en- us/access-help/troubleshoot-compacting-repair-or-recovering-an-access-file -HP005188316.aspx?queryid = 728e1007c19b43bba069cb7f11364f7a&respos = 0&CTT = 1 即使鏈接是用於修復,我認爲您的權限問題可能會由於壓實和修復需要獨佔訪問權限,因此需要解決它。 希望它有幫助! – Vaibhav 2010-08-03 14:53:24

+0

自Jet 3.51以來,沒有一個單獨的「修復」過程,c。如果發現文件的內部結構已損壞,修復將作爲緊湊進程的一部分發生。所以,真的只有COMPACT纔會擔心。 – 2010-08-03 20:08:31

0

緊湊的方式&在Access中修復工作是它壓縮到一個新的文件,刪除原來的文件,然後重命名。你可以使用DAO引擎來做同樣的事情。至於我可以從微軟的Visual C#2010速成告訴,你可以設置爲DAO的引用和使用:

var MyDBE=new DAO.DBEngine(); 
MyDBE.CompactDatabase("c:\\docs\\Mybe.mdb", "c:\\docs\\temp.mdb"); 

爲了保證數據庫不在使用中,您可以檢查是否存在的.ldb。

對不起,我對c#一無所知,所以這些註釋非常粗糙。

+0

LDB文件的存在並不意味着該文件處於打開狀態,因爲LDB文件可以在最後一個用戶關閉後留下。發生這種情況的場景很多,包括但不限於如果用戶缺少文件夾的DELETE權限。如果LDB不在那裏,就意味着沒有人打開它,但如果它在那裏,它只表明有人可能會打開它,而不是證明它。檢查的一種方法是嘗試刪除LDB文件(如果存在的話),但是那樣會導致產生的錯誤,因此您可能只需要捕獲緊湊的失敗錯誤。 – 2010-08-03 20:10:40

2

也許連接池是問題? 不完全確定連接池在哪裏實現(我相信這只是提供程序的一部分,例如SQL服務器,因此可能與此問題無關) 但是,即使使用連接對象,它也將保持客戶端和服務器之間的連接處於打開狀態設置爲「關閉」。 您可以使用conn.ClearPool清除sql服務器連接池 您使用什麼提供程序連接到數據庫? (OLEDB?) 如果是這樣嘗試ReleaseObjectPool()

+0

5分鐘前我有這個問題,雖然我沒有明確調用'OleDbConnection.ReleaseObjectPool()',而是設置了連接字符串參數'OLE DB Services = -2',它顯式地禁用了連接池。 – Rabid 2010-08-04 09:41:40