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

50

我在C#的单元测试项目中使用SQL Express数据库。我的数据库位于这里:

./Databases/MyUnitTestDB.mdf

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

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

我看到过使用|DataDirectory|,但我是否正确地认为它仅适用于Web应用程序?

我想在应用程序配置文件中控制这个,因为在生产环境中,应用程序使用托管的SQL数据库。

7个回答

72

非常感谢大家,我结合了你们的建议。

在我的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 ...
}

2
了解更多关于 DataDirectory 术语的信息,请访问:http://msdn.microsoft.com/en-us/library/cc716756.aspx(查找“DataDirectory”,它在文档的末尾) - Yves M.

13

是的,|DataDirectory|用于选择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文件名和路径。

  • System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) -- 这将获取当前程序集"dll, exe, ..."所在的路径。不受应用程序类型、路径更改等影响,始终返回程序集所在的目录。

  • Environment.CurrentDirectory -- 当前目录。例如,如果您导航到文件夹中,这个值可能会更改。

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


谢谢Dubas,选项1是我想要使用的,但是我无法让它工作。 - Adam Jenkin
选项1取决于您的执行路径。如果您的UInit测试使用不同的路径执行,那么使用相对路径可能会导致与预期路径不同的路径。 - Dubas
1
@Dubas |DataDirectory| 变量不仅适用于 Web 应用程序,您可以在任何地方使用它。 - Anton Kalcik

8

我花了整整一天时间在谷歌上搜索这个问题,最终从这里找到了线索。

以下是我的解决方案:
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


5
我正在使用VS2010和C#3.0构建一个简单的Windows Forms应用程序,同时使用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”文件夹添加到我的应用程序中,因为我习惯于在该文件夹中使用数据库,但是VS无法识别该文件夹。

完美的解决方案。谢谢。 - sapatelbaps

2

我这里没有Visual Studio,但是可以考虑以下方法:

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

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

2
我建议沿着这条线路做些尝试,或许可以与 ADO.NET 的 连接字符串生成器 一起使用来组合最终的连接字符串。 - stakx - no longer contributing

1
我做了以下的事情。希望能对某些人有所帮助。
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));

0

SQL Server连接中的动态路径

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接