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

C# 如何从配置设置中读取| DataDirectory |的当前路径,c#,sql-server-ce,datadirectory,C#,Sql Server Ce,Datadirectory,我正在编写一个程序,要求用户在应用程序启动时选择活动数据库。我有一个Windows窗体,它将列出存储在ApplicationData子文件夹中的数据库,专门用于存储数据库文件。但是,当我创建一个新数据库时,我需要复制模板数据库,但无法确定默认情况下它存储在哪里 我试过: dpath = ConfigurationManager.AppSettings["DataDirectory"]; 但我似乎总是得到一个空值作为回报。有一次我放弃了,我想我可以将数据目录设置到我选择的文件夹中,但似乎我在执行

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

我试过:

dpath = ConfigurationManager.AppSettings["DataDirectory"];
但我似乎总是得到一个空值作为回报。有一次我放弃了,我想我可以将数据目录设置到我选择的文件夹中,但似乎我在执行程序时做得太晚了,它无法生效

newdpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyAppFolder";
如果您能给我一些建议,告诉我如何找到数据库的位置,或者让我自己尽早设置数据库,以影响程序的运行,我将不胜感激

编辑:

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


谢谢。

|数据目录|
不是来自配置设置;你把三种不同的东西混在一起了:

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_数据文件夹
  • Visual Studio调试器使用调试文件夹
注意.MSI安装程序可以允许用户更改DataDirectory;这就是为什么您永远不应该硬编码或更改
DataDirectory
,如果这样做,就无法找到应用程序数据的部署位置。对于可执行文件部署的只读二进制数据,通常使用
DataDirectory
文件夹


如果需要写入与可执行文件一起部署的数据,则应首先将其复制到用户能够写入的位置,如
环境.SpecialFolder.ApplicationData
,然后写入副本。
DataDirectory
不仅不一定是用户可以写的,它是部署的一部分,而不是用户数据的一部分;如果修复或卸载可执行文件,则会重新安装或删除
DataDirectory
。用户不喜欢您删除他们的数据,因此不要将其保存到
数据目录

环境中。GetFolderPath(Environment.SpecialFolder.ApplicationData)
每次开发时,代码都会返回空值。安装程序时设置| DataDirectory |

构建项目,然后安装并测试它

我使用这行代码在运行时压缩已安装应用程序中的数据库

该代码可以设置为变量,如下所示。。。 淡啤酒和浓啤酒一样

Beer = Environmenr.GetFolderPath(Environment.SpecialFolder.ApplicationData)
这将返回已安装的| DataDirectory |的文件夹路径。 使用CStr和另一个变量在上添加数据库名称

Dim MyPathA As String = CStr(Beer & "\Workout.mdb")
Dim MyPathB As String = CStr(Beer & "\BackupWorkout.mdb")

Dim JRO As JRO.JetEngine
JRO.CompactDatabase(CStr("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MyPathA), _
CStr("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & MyPathB & ":Jet OLEDB:Engine Type=5"))

On error Errorhandler, 
Errothandler
Kill(MyPathB)
第一行是您的数据库,第二行将其重命名为备份并压缩到同一目录中。如果那里有备份,它将触发错误,删除备份

然后,说这是按钮点击。 再运行一遍。 就在压井线之后

Me.Buttonx.PerformClick()

这就是如何在已安装的ClickOnce应用程序中压缩数据库。在代码中使用| DataDirectory |将抛出非法字符错误…

在使用ConnectionString、TableAdapter等之前放置此行。。。创建所谓的数据目录

我刚刚通过将它放在TableAdapter.Fill(DataSet.DataTable)之前成功地进行了测试


我找不到数据目录的位置和内容,因为它不存在,所以MSSQL将使用AppDomain.CurrentDomain的基本目录

非常感谢您的澄清。我知道ApplicationData目录是什么,现在我明白了,我把你的答案中的第一个和第三个文件夹弄混了。@Dour-High\u Arch我试图将第三个文件夹作为字符串检索,但我一直得到空值。这将在VisualStudio调试器的上下文中进行。我尝试了以下操作:string defaultpath=AppDomain.CurrentDomain.GetData(“DataDirectory”).ToString();但是没有运气。建议?@PAUL,嗯。。。我也从调试器获得DataDirectory null。请尝试
AppDomain.CurrentDomain.BaseDirectory
。很抱歉,现在还不知道DataDirectory和BaseDirectory之间的区别。有人建议我使用AppBase文件夹,但我知道这仅对某些安装程序有效。不可原谅
AppDomain.CurrentDomain.SetData("DataDirectory", @"Full path to your data folder");