我安装了VS2019并开始培训,我正试图使用[DataDirectory]连接到我的数据库,数据库文件在我的Debug文件夹中,我正在使用以下Conn字符串cstr = @"server=(localdb)MSSQLLocalDB;AttachDbFilename=[DataDirectory]test.mdf;Integrated Security = True;";
,但我收到了这个错误
为文件[DataDirectory]\test.mdf附加自动命名数据库的尝试失败。存在具有相同名称的数据库,或者指定的文件无法打开,或者它位于UNC共享上
但如果我用另一个固定位置(如D:\Test.mdf (更改[datadirectory],它就会工作
我的代码:
string cstr;
SqlConnection cnn;
cstr = @"server=(localdb)MSSQLLocalDB;AttachDbFilename=[DataDirectory]Test.mdf;Integrated Security = True;";
cnn = new SqlConnection(cstr);
cnn.Open();
MessageBox.Show("Connection Open !");
cnn.Close();
请帮忙。
最终找到了我的解决方案,我使用的是System.Data.SqlClient
,它不支持|DataDirectory|中的:AttachDbFilename=
。新的SqlClient Provider包:Microsoft.Data.SqlClient
是从现在起应该使用的,它支持AttachDbFilename=
中的AppDomains和|DataDirectory|
宏
对于使用System.Data.SqlClient,应使用以下方法检索连接字符串中的DB位置:AppDomain.CurrentDomain.BaseDirectory
所以System.Data.SqlClient
的连接字符串应该是这样的:
cstr = @"server=(localdb)MSSQLLocalDB;AttachDbFilename="+ AppDomain.CurrentDomain.BaseDirectory+"Database.mdf ; Integrated Security = True";
这应该可以解决的问题
替换字符串是从当前AppDomain中读取的。
ADO.NET |数据目录|这是在哪里记录的?
但在.Net Core中,AppDomain是一种已停产的技术
MS.Net博客|移植到.Net核心
应用程序域
为什么停产AppDomains需要运行时支持,并且通常相当昂贵。虽然仍然由CoreCLR实现在.NET Native中不可用,我们不打算添加此能力。
我测试了它,字符串替换不适用于.Net Core 3.1
因此,您必须自己实现该替换,或者从外部配置文件中读取数据。
我认为问题实际上是因为事情没有像以前那样正常工作。我已经看到了关于如何与SQL Server LocalDB建立连接的各种答案。
以下是我在VS 2022、.NET 6和EF Core 6中恢复的解决方案。
将连接字符串与Initial Catalog
和AttachDbFilename
同时使用。此外,还包括一个名为[DataDirectory]
的宏,稍后将进行扩展:
"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=MyDatabase;AttachDbFilename=[DataDirectory]\MyDatabase.mdf;"
使用以下代码获取实际连接字符串:
string connStr = config.GetConnectionStringWithExpand("MyDatabaseConnection")
public static class ExtensionMethods
{
public static string GetConnectionStringWithExpand(this IConfiguration config, string name)
{
string projectDirectory = Environment.CurrentDirectory;
string dataDirectory = Path.Combine(projectDirectory, "App_Data");
Directory.CreateDirectory(dataDirectory);
string connStr = config.GetConnectionString(name);
return connStr.Replace("[DataDirectory]", dataDirectory);
}
}
在VisualStudio中运行应用程序时,App_Data
文件夹将放在项目文件夹中,否则将放在入口点旁边。