2012-09-04 73 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之间的区别。 –