我使用 SQL Express 数据库作为 C# 单元测试项目的一部分。我的数据库位于这里:
./Databases/MyUnitTestDB.mdf
我想在
app.config
中使用相对路径或变量,而不是将连接字符串定义为:
AttachDbFilename=C:\blah\blah\blah\yea\yea\yea\MyApplication\Databases\MyUnitTestDB.mdf
我已经看到了
|DataDirectory|
的使用,但我认为这仅适用于 Web 应用程序是否正确?
我想在应用程序配置文件中控制这一点,因为在生产中应用程序使用托管 SQL 数据库。
谢谢大家,我综合了你们的回复。
在我的 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 ...
}
是的,|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.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
我花了一整天的时间在谷歌上搜索这个问题,终于从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);
}
我正在使用 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无法识别该文件夹。
我这里没有 Visual Studio,但是:
using System.IO;
using System.Windows.Forms;
string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"
我做了以下事情。希望它对某人有帮助。
AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
SqlConnection con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;
YouTube 上有一个视频解决了这个问题...它展示了如何使用 C# 窗口表单成功连接到应用程序启动文件夹中的本地 .mdf 数据库文件...它甚至有一个示例,其中导师显示了来自的表格将 .mdf 文件转换为 datagridview...非常棒且易于理解...还有一个下载教程中使用的代码的链接...这是视频:https://youtu.be/awX9DpO2Xtk
我希望它可以帮助您和其他人 100% 理解这个主题