【问题标题】:How do I read the current path of |DataDirectory| from config settings如何读取 |DataDirectory| 的当前路径从配置设置
【发布时间】:2012-08-29 07:35:20
【问题描述】:

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

我试过了:

dpath = ConfigurationManager.AppSettings["DataDirectory"];

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

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

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

编辑:

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

谢谢。

【问题讨论】:

    标签: c# sql-server-ce datadirectory


    【解决方案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 应用程序中压缩数据库的方法。使用 |数据目录|在代码中会抛出非法字符错误...

    【讨论】:

      【解决方案2】:

      |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 文件夹来存储与您的可执行文件一起部署的只读二进制数据。

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

      【讨论】:

      • 非常感谢您的澄清。我知道 ApplicationData 目录是什么,现在我明白我在你的回答中混淆了第一个和第三个文件夹。
      • @Dour-High_Arch 我尝试将第三个文件夹作为字符串检索,但我一直得到一个空值。这将在 VisualStudio 调试器的上下文中。我尝试了以下方法: string defaultpath = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();但没有运气。建议?
      • @PAUL,嗯...我也从调试器中得到 DataDirectory null。试试AppDomain.CurrentDomain.BaseDirectory。对不起,不知道DataDirectory和BaseDirectory的区别。
      • 有人建议我使用 AppBase 文件夹,但我知道这仅适用于某些安装程序。
      • 不幸的是,如果您允许用户指定安装文件夹,您必须使用像 DataDirectoryBaseDirectory 这样的部署属性。
      【解决方案3】:

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

      我刚刚测试成功,把它放在 TableAdapter.Fill(DataSet.DataTable); 之前

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

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

      【讨论】:

        猜你喜欢
        • 2018-04-19
        • 2017-06-18
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多