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

时间:2012-09-04 15:40:31

标签: c# sql-server-ce datadirectory

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

我试过了:

dpath = ConfigurationManager.AppSettings["DataDirectory"];

我似乎总是得到一个null值。有一次我放弃了,并且认为我可以将 DataDirectory 设置为我选择的文件夹,但似乎我在执行程序时执行此操作已经太迟了以使其生效。

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

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

编辑:

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

谢谢。

3 个答案:

答案 0 :(得分:23)

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

ConfigurationManager.AppSettings["DataDirectory"]

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

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

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

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

AppDomain.CurrentDomain.GetData("DataDirectory")

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

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

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

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

答案 1 :(得分:0)

在使用ConnectionString,TableAdapter等创建所谓的 DataDirectory 之类的东西之前,先放置此行。

通过将它放在TableAdapter.Fill(DataSet.DataTable);之前,我已经成功测试了

AppDomain.CurrentDomain.SetData("DataDirectory", @"Full path to your data folder");

我找不到 DataDirectory 的位置和位置,因为它不存在,因此MSSQL将采用AppDomain.CurrentDomain的 BaseDirectory

答案 2 :(得分:-1)

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

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

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

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

Beer = Environmenr.GetFolderPath(Environment.SpecialFolder.ApplicationData)

这将返回INSTALLED | 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)

第一行是您的数据库,第二行将其重命名为Backup并将其压缩在同一目录中。如果那里有备份,它将触发错误,这将删除备份。

然后,说这是单击按钮。 再次运行。 在杀戮线之后,

Me.Buttonx.PerformClick()

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