【问题标题】:Connection string with relative path to the database file具有数据库文件相对路径的连接字符串
【发布时间】:2010-12-22 11:06:12
【问题描述】:

我在 winforms 应用程序中从 sdf 数据库加载数据。我使用数据库文件的完整路径。示例:

conn = new SqlCeConnection

{

ConnectionString ="Data Source=F:\\My Documents\\Project1\\bin\\Debug\\Database.sdf"

};

我想使用数据库文件的相对路径。例如。我在文件夹 F:\My Documents\Project1\bin\Debug\Data\file.sdf 中有 sdf 文件,我想在连接字符串中使用相对路径。 有什么建议吗?谢谢。

【问题讨论】:

  • 你确定你有相对路径吗?您键入的“F:\My Documents\Project1\bin\Debug\Data\file.sdf”也是完整路径。如果您的应用程序已经从“F:\My Documents\Project1\bin\”运行,则相对路径类似于“\data\file.sdf”

标签: c# string connection sql-server-ce


【解决方案1】:

相对路径:

ConnectionString = "Data Source=|DataDirectory|\Database.sdf";

将 DataDirectory 修改为可执行文件的路径:

string executable = System.Reflection.Assembly.GetExecutingAssembly().Location;
string path = (System.IO.Path.GetDirectoryName(executable));
AppDomain.CurrentDomain.SetData("DataDirectory", path);

【讨论】:

【解决方案2】:

如果数据库文件存在,请在工作目录中尝试此代码,如下所示。

D:\HMProject\DataBase\HMProject.sdf

string Path = Environment.CurrentDirectory;
string[] appPath =  Path.Split(new string[] { "bin" }, StringSplitOptions.None);
AppDomain.CurrentDomain.SetData("DataDirectory", appPath[0]);

.sdf 文件的连接字符串

<add name="LocalDB" connectionString="metadata=res://*/Client.HMProject.csdl|res://*/Client.HMProject.ssdl|res://*/Client.HMProject.msl;provider=System.Data.SqlServerCe.4.0;provider connection string="Data Source=|DataDirectory|\Database\HMProjectDB.sdf;Password=HMProject;Persist Security Info=False;"" providerName="System.Data.EntityClient" />

谢谢

ck.尼丁(TinTin)

【讨论】:

    【解决方案3】:

    相对于什么,您的应用程序?如果是这样,那么您可以简单地使用以下命令获取应用程序的当前路径:

    System.Environment.CurrentDirectory 
    

    并将其附加到连接字符串

    【讨论】:

    • 您不能只是“将其附加到连接字符串”。您必须解析连接字符串,提取数据源值,添加当前目录,然后重建连接字符串。这很重要。
    【解决方案4】:

    在连接字符串中的相对路径出现几个奇怪的错误后,我觉得有必要在此处发布。

    使用“|DataDirectory|”时或 "~" 你不能使用 "../" 来加强和退出!

    示例是使用多个项目访问放置在其中一个项目中的同一个 localdb 文件。

    “~/../other”和“|DataDirectory|/../other”将失败

    即使它写得很清楚 at MSDN here 它给出的错误有点不清楚,很难找到,在 SO 上也找不到。

    【讨论】:

      【解决方案5】:

      在你的配置文件中给出相对路径

      ConnectionString = "Data Source=|DataDirectory|\Database.sdf";
      

      将 DataDirectory 更改为您的可执行路径

      string path = AppDomain.CurrentDomain.BaseDirectory;
      AppDomain.CurrentDomain.SetData("DataDirectory", path);
      

      如果您使用的是 EntityFramework,那么您可以在 Context 类中设置 DataDirectory 路径

      【讨论】:

        【解决方案6】:
           <?xml version="1.0"?>  
        <configuration>  
          <appSettings>  
            <!--FailIfMissing=false -->  
            <add key="DbSQLite" value="data source=|DataDirectory|DB.db3;Pooling=true;FailIfMissing=false"/>  
          </appSettings>  
        </configuration>  
        

        【讨论】:

        • 不要在 中存储连接字符串。他们有自己的部分。
        【解决方案7】:

        请您试试下面的代码块,这正是您要找的:

        SqlConnection conn = new SqlConnection
        {
            ConnectionString = "Data Source=" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\Database.sdf"
        };
        

        【讨论】:

          【解决方案8】:

          我在 web.config 文件中做了这个。我添加到 Sobhan 的答案中,谢谢。

          <connectionStrings>
              <add name="listdb" connectionString="Data Source=|DataDirectory|\db\listdb.sdf"/>
            </connectionStrings>
          

          “db”成为我的数据库目录而不是“App_Data”目录。

          并正常打开:

          var db = Database.Open("listdb");

          【讨论】:

            【解决方案9】:

            我在尝试为连接到 Windows 窗体应用程序的数据库指定相对文件路径时遇到了同样的问题。我能够按照 Microsoft 向 Windows 窗体添加数据源的说明(例如,for connecting an Access database)解决了这个问题。

            通过使用此方法,Visual Studio 将为您设置数据库的相对文件路径,而不是尝试手动设置。如果您的数据库在您的应用程序外部,它将创建数据库的副本并将其添加到您的应用程序的适当位置。尽管您可以在 App.config 和/或 Settings.settings 或您的一个脚本中手动更改连接字符串,但我发现此方法容易出错。相反,我发现通常最好遵循 Microsoft 的说明。

            【讨论】:

              【解决方案10】:

              这对我有用:

              string Connection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                  + HttpContext.Current.Server.MapPath("\\myPath\\myFile.db")
                  + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";
              

              我正在查询一个 XLSX 文件,所以不要担心连接字符串中的任何其他内容,但数据源除外。

              所以我的答案是:

              HttpContext.Current.Server.MapPath("\\myPath\\myFile.db")
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-06-27
                • 2014-10-29
                • 2020-05-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多