2012-09-04 72 views
4

我正在編寫一個程序,要求用戶在應用程序啓動時選擇活動數據庫。我有一個Windows窗體,它將列出存儲在專門用於存儲數據庫文件的子文件夾ApplicationData中的數據庫。然而,當我創建一個新的數據庫時,我需要複製模板數據庫,但無法確定它默認存儲的位置。如何讀取| DataDirectory |從配置設置

我已經試過:

dpath = ConfigurationManager.AppSettings["DataDirectory"]; 

我似乎總是得到的回報一個空值雖然。有一次,我放棄了,並認爲我可以將DataDirectory設置爲我選擇的文件夾,但似乎我在執行我的程序時太遲了,以使其生效。

newdpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyAppFolder"; 

我將不勝感激如何可以找到數據庫的位置有任何建議,或將其設爲自己及早到影響程序運行。

編輯:

對於第二部分中,我發現,我試圖修改TableAdapter.Fill命令後連接字符串已經被執行,從而解釋了爲什麼它被打開默認數據庫。那個謎已經解決了。然而,第一部分仍然是一個未知數。

謝謝。

回答

22

|DataDirectory|不是來自配置設置;你在混合三種不同的東西:

ConfigurationManager.AppSettings["DataDirectory"] 

這來自配置設置;一個.config文件,你必須創建並放入你的項目。此特定設置是AppSettings元素中包含鍵"DataDirectory"的元素的值。這不存在,除非你把一個放在.config文件中。通常情況下,這是您將配置或啓動數據永遠不會更改的位置。你不應該在這裏放置文件路徑,因爲它們在用戶安裝數據庫的機器上可能不同。

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

這是通向操作系統的應用程序被安裝上定義當前用戶的漫遊應用程序數據文件夾。你不能改變它,它是由操作系統定義的。您可以確定此文件夾可由用戶寫入,並且在用戶漫遊或從另一臺計算機登錄時可用。這通常是你想放置可編輯用戶數據的地方。

SqlConnection("Data Source=|DataDirectory|DatabaseFileName.sdf;...") 

這是ADO.NET連接的連接字符串。 ADO.NET專門處理垂直條,它會查找與垂直條之間的鍵名相匹配的AppDomain數據。你可以使用相同的數據:

AppDomain.CurrentDomain.GetData("DataDirectory") 

那麼什麼的DataDirectory值寫入?它通過部署您的可執行文件完成:

  • .MSI安裝程序將其定義爲應用程序的目標文件夾。
  • ClickOnce在您的項目中定義了一個特殊的數據文件夾。
  • Web應用程序使用App_Data文件夾。
  • Visual Studio調試器使用調試文件夾。

請注意.MSI安裝程序可以允許用戶更改DataDirectory;這就是爲什麼您不應該硬編碼或更改DataDirectory,如果您確實無法找到應用程序數據的部署位置。您通常使用DataDirectory文件夾作爲與可執行文件一起部署的只讀二進制數據。

如果您需要寫入使用可執行文件部署的數據,則應先將其複製到您知道用戶可以寫入的位置,例如Environment.SpecialFolder.ApplicationData,然後寫入副本。不僅DataDirectory不一定由用戶寫入,它是部署的一部分而不是用戶數據的一部分;如果您修復或卸載您的可執行文件,然後DataDirectory得到重新安裝或刪除。用戶在刪除其數據時不喜歡它,因此不要將其保存到DataDirectory

+0

非常感謝您的澄清。我知道ApplicationData目錄是什麼,現在我明白了我對你答案中的第一個和第三個文件夾感到困惑。 –

+0

@ Dour-High_Arch我試圖將第三個文件夾作爲字符串進行檢索,但我一直收到一個空值。這將在VisualStudio調試器的上下文中進行。我嘗試了以下方法: string defaultpath = AppDomain.CurrentDomain.GetData(「DataDirectory」)。ToString(); 但沒有運氣。建議? –

+2

@PAUL,嗯......我也從調試器中獲得DataDirectory null。試試'AppDomain.CurrentDomain.BaseDirectory'。對不起,不知道DataDirectory和BaseDirectory之間的區別。 –