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

时间:2010-08-17 08:57:05

标签: c# sql connection-string database-connection sql-server-express

我在SQL#中使用SQL Express数据库作为单元测试项目的一部分。我的数据库位于:

./Databases/MyUnitTestDB.mdf

我想在app.config中使用相对路径或变量,而不是将我的连接字符串定义为:

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

我已经看过使用|DataDirectory|,但我认为这只适用于网络应用程序吗?

我想在应用程序配置文件中控制它,因为在生产中应用程序使用托管的sql数据库。

7 个答案:

答案 0 :(得分:64)

谢谢大家,我结合使用了你的回复。

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

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

在我的单元测试类中,我使用以下

设置DataDirectory属性
[TestInitialize]
public void TestInitialize()
{
    AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases"));

    // rest of initialize implementation ...
}

答案 1 :(得分:11)

是, | DataDirectory | Web应用程序,用于选择Web应用程序的App_Data目录。

在非Web应用程序中,根据.NET Framework,可以使用 AppDomain.SetData

来更改它。

但是你有另外两个可能性来创建连接:

1.-使用相对路径:

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

2.-获取应用程序路径并添加到字符串 在c#Windows应用程序中,您可以使用Application.StartupPath

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

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

  • Application.StartupPath - 启动应用程序的exe应用程序的起始路径
  • Application.ExecutablePath - 启动路径,用于统计应用程序的exe应用程序的名称 但要使用Application,您需要包含未包含在控制台应用程序中的System.Windows.Forms。

  • <强> System.IO.Path.GetDirectoryName(   System.Reflection.Assembly.GetExecutingAssembly()。GetName()。CodeBase ) - 这从当前程序集“dll,exe,...”获取路径不受应用程序类型,路径更改的影响。 ..始终在Assemby所在的位置返回目录。

  • Environment.CurrentDirectory - 当前目录。例如,如果您导航到文件夹,则可以更改此内容。

您可以在此处找到有关不同连接字符串选项的更多信息 http://www.connectionstrings.com/sql-server-2005

答案 2 :(得分:7)

我花了一整天的时间用谷歌搜索来完成这项工作,最后得到this

的线索

这是我的解决方案:
1.使用| DataDirectory |在连接字符串

<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);
}

enter image description here

答案 3 :(得分:4)

我正在使用带有C#3.0的VS2010构建一个简单的Windows窗体应用程序。也使用SQL Express 2008 RC2。

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

我认为这将是你们所有人尝试的第一件事,所以这就是为什么我要指定我的VS和SQL版本。或者它可能是C#3.0的新功能。

我的完整连接字符串:

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

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

答案 4 :(得分:2)

我这里没有Visual Studio,但是:

using System.IO;
using System.Windows.Forms;

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"

答案 5 :(得分:1)

我做了以下事情。希望它可以帮助某人。

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

答案 6 :(得分:0)

SQL Server连接中的动态路径

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