5

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

我试过了:

dpath = ConfigurationManager.AppSettings["DataDirectory"];

不过,我似乎总是得到一个空值作为回报。有一次我放弃了,并认为我可以将DataDirectory设置为我选择的文件夹,但似乎我在执行程序时这样做太晚了,无法使其生效。

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

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

编辑:

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

谢谢你。

4

3 回答 3

27

|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 在您的项目中定义了一个特殊的数据文件夹。
  • Web 应用程序使用 App_Data 文件夹。
  • Visual Studio 调试器使用调试文件夹。

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

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

于 2012-09-04T17:42:02.457 回答
0

在使用 ConnectionString、TableAdapter 等创建所谓的DataDirectory之前放置这一行。

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

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

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

于 2020-05-04T16:37:57.037 回答
-1

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

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

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

该代码可以设置为变量,如下所示...

Dim Beer as string
Beer = Environment.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 应用程序中压缩数据库的方法。使用 |数据目录| 在代码中会抛出非法字符错误...

于 2019-07-11T05:46:30.123 回答