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

问题描述 投票:0回答:8

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

./Databases/MyUnitTestDB.mdf

我想在

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

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

我已经看到了

|DataDirectory|
的使用,但我认为这仅适用于 Web 应用程序是否正确?

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

c# sql connection-string database-connection sql-server-express
8个回答
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 ...
}

13
投票

是的,|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 应用程序的名称 但是要使用应用程序,您需要包含未包含在控制台应用程序中的 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


8
投票

我花了一整天的时间在谷歌上搜索这个问题,终于从this

得到了线索

这是我的解决方案:
1. 使用|数据目录|在连接字符串中

<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 窗体应用程序。还使用 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无法识别该文件夹。


2
投票

我这里没有 Visual Studio,但是:

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

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

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;" ;

0
投票

YouTube 上有一个视频解决了这个问题...它展示了如何使用 C# 窗口表单成功连接到应用程序启动文件夹中的本地 .mdf 数据库文件...它甚至有一个示例,其中导师显示了来自的表格将 .mdf 文件转换为 datagridview...非常棒且易于理解...还有一个下载教程中使用的代码的链接...这是视频:https://youtu.be/awX9DpO2Xtk

我希望它可以帮助您和其他人 100% 理解这个主题

© www.soinside.com 2019 - 2024. All rights reserved.