SQL Express连接string:相对于应用程序位置的mdf文件位置

我正在使用SQL Express数据库作为C#中的unit testing项目的一部分。 我的数据库位于这里:

./Databases/MyUnitTestDB.mdf 

我想在app.config使用相对path或variables,而不是将连接string定义为:

 AttachDbFilename=C:\blah\blah\blah\yea\yea\yea\MyApplication\Databases\MyUnitTestDB.mdf 

我已经看到|DataDirectory|的使用 但我是否正确认为这只适用于Web应用程序?

我想在应用程序configuration文件中控制这个,因为在生产中应用程序使用托pipe的sql数据库。

谢谢大家,我结合了你的回答。

在我的app.config文件中,我的连接string定义如下

 <add name="MyConnectionString" connectionString="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" /> 

在我的unit testing类中,我使用以下设置DataDirectory属性

 [TestInitialize] public void TestInitialize() { AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases")); // rest of initialize implementation ... } 

是的, | DataDirectory | Web应用程序来selectWeb应用程序的App_Data目录。

在非web应用程序中,取决于.NET Framework,可以使用它并使用AppDomain.SetData进行更改

但是你有另外两个可能性来build立连接:

1.-使用相对path:

 String con ="... AttachDbFilename=Databases\MyUnitTestDB.mdf ... "; 

2.-获取应用程序path并添加到string
在C#Windows应用程序中,您可以使用Application.StartupPath

  String con= " ... AttachDbFilename=" + Application.StartupPath + "\Databases\MyUnitTestDB.mdf ... "; 

根据应用types或启动模式,您可以获得不同的属性。 例如:

  • Application.StartupPath – 启动应用程序的exe应用程序的开始path
  • Application.ExecutablePath – 开始path的统计应用程序的EXE应用程序的名称但要使用应用程序,您需要包括System.Windows.Forms,不包括在控制台应用程序。

  • System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()。GetName()。CodeBase ) – 从当前程序集“dll,exe,…”获取path不受应用程序types的影响,path更改,…总是在Assemby驻留时总是返回目录。

  • Environment.CurrentDirectory – 当前目录。 例如,如果您导航到文件夹,这可以被改变。

你可以在http://www.connectionstrings.com/sql-server-2005find更多关于不同连接string的选项;

我花了一整天的时间来search这个网站,最后得到了一些线索

这是我的解决scheme:
1.使用| DataDirectory | 在连接string中

 <add name="NorthwindConnectionString" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|\Northwind.mdf;User Instance=True" providerName="System.Data.SqlClient" /> 

2.在ClassInitialize中设置DataDirectory

 [ClassInitialize()] public static void MyClassInitialize(TestContext testContext) { string baseDir = AppDomain.CurrentDomain.BaseDirectory; int index = baseDir.IndexOf("TestResults"); string dataDir = baseDir.Substring(0, index) + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); } 

在这里输入图像描述

我用C#3.0构build了一个简单的Windows Forms应用程序。 还使用SQL Express 2008 RC2。

我可以在连接string中单独使用: |DataDirectory|MyDb.mdf而不更改其他任何内容。 |DataDirectory| 指向我的.exe文件的位置。

我会认为这将是所有人都会尝试的第一件事,所以这就是我指定我的VS和SQL版本的原因。 或者,也许这是C#3.0的新function。

我完整的连接string:

 "Server=.\SQLExpress;AttachDbFilename=|DataDirectory|App_Data\ThumbsUpPlayer.mdf;Database=ThumbsUpPlayer;Trusted_Connection=Yes;" 

请注意,我已将“App_Data”文件夹添加到我的应用程序,因为我习惯于在该文件夹中的Db,文件夹不被VS识别。

我在这里没有Visual Studio,但是呢:

 using System.IO; using System.Windows.Forms; string appPath = Path.GetDirectoryName(Application.ExecutablePath); AttachDBFilme = appPath + "\\MyUnitTestDB.mdf" 

SQL Server连接中的dynamicpath

 SqlConnection con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ; 

我做了以下。 希望它可以帮助别人。

 AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));