在 Windows 窗体 C# .NET Core 中使用 [DataDirectory] 时无法连接到 localdb



我安装了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 CatalogAttachDbFilename同时使用。此外,还包括一个名为[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文件夹将放在项目文件夹中,否则将放在入口点旁边。

相关内容

  • 没有找到相关文章

最新更新