如何读取| DataDirectory |的当前路径 从配置设置

PAU*_*SNE 5 c# sql-server-ce datadirectory

我正在编写一个程序,要求用户在应用程序启动时选择活动数据库.我有一个Windows窗体,它将列出存储在ApplicationData子文件夹中的数据库,专门用于存储数据库文件.但是,当我创建一个新数据库时,我需要复制模板数据库,但无法确定默认情况下存储的位置.

我试过了:

dpath = ConfigurationManager.AppSettings["DataDirectory"];
Run Code Online (Sandbox Code Playgroud)

我似乎总是得到一个null值作为回报.有一次我放弃了,并且认为我可以将DataDirectory设置为我选择的文件夹,但是在执行我的程序时我似乎已经太晚了才能使它生效.

newdpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyAppFolder";
Run Code Online (Sandbox Code Playgroud)

我很感激有关如何找到数据库位置的任何建议,或者我自己尽早设置它以影响程序操作.

编辑:

对于第二部分,我发现在尝试执行TableAdapter.Fill命令后,我尝试修改连接字符串,从而解释了为何打开默认数据库.这个谜团已经解决了.然而,第一部分仍然是一个未知数.

谢谢.

Dou*_*rch 24

|DataDirectory|不是来自配置设置; 你混合了三件不同的东西:

ConfigurationManager.AppSettings["DataDirectory"]
Run Code Online (Sandbox Code Playgroud)

这来自配置设置; 您必须创建并放入项目的.config文件.此特定设置是元素中具有键"DataDirectory"AppSettings元素的值.除非您在.config文件中放置一个,否则这不存在.通常,这是您放置永不更改的配置或启动数据的位置.您不应该在此处放置文件路径,因为在用户安装数据库的计算机上它们可能不同.

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Run Code Online (Sandbox Code Playgroud)

这是安装应用程序的操作系统定义的当前用户漫游应用程序数据文件夹的路径.你不能改变它,它是由操作系统定义的.您可以确定该文件夹是用户可写的,并且如果用户漫游或从另一台计算机登录,则该文件夹可用.这通常是您要放置可编辑用户数据的位置.

SqlConnection("Data Source=|DataDirectory|DatabaseFileName.sdf;...")
Run Code Online (Sandbox Code Playgroud)

这是ADO.NET连接的连接字符串.ADO.NET专门处理垂直条,它查找与垂直条之间的键名匹配的AppDomain数据.您可以使用以下方法获取相同的数据

AppDomain.CurrentDomain.GetData("DataDirectory")
Run Code Online (Sandbox Code Playgroud)

那么什么写出了价值DataDirectory?它是通过任何部署您的可执行文件来完成的:

  • .MSI安装程序将其定义为应用程序的目标文件夹.
  • ClickOnce在项目中定义一个特殊的数据文件夹.
  • Web应用程序使用App_Data文件夹.
  • Visual Studio调试器使用调试文件夹.

请注意.MSI安装程序可以允许用户更改DataDirectory; 这就是为什么你永远不应该硬编码或更改DataDirectory,如果这样做,就无法找到部署应用程序数据的位置.您通常将该DataDirectory文件夹用于与可执行文件一起部署的只读二进制数据.

如果您需要写入使用可执行文件部署的数据,则应首先将其复制到您知道用户可以写入的位置,例如Environment.SpecialFolder.ApplicationData,并写入副本.不仅DataDirectory不一定是用户可写的,它是部署的一部分而不是用户数据的一部分; 如果您修复或卸载可执行文件,则会DataDirectory重新安装或删除.用户在删除数据时不喜欢它,因此请不要将其保存DataDirectory.

  • @PAUL,嗯...我也从调试器中获取DataDirectory null.试试`AppDomain.CurrentDomain.BaseDirectory`.抱歉,不知道DataDirectory和BaseDirectory之间的区别. (2认同)