在Windows Forms 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();

请帮助。

解决方法

替换字符串是从当前AppDomain中读取的。

ADO.NET |DataDirectory| where is this documented?

但是在.Net Core中,AppDomain是一种已停产的技术

MS .Net blog | Porting to .NET Core

应用程序域

为什么终止? AppDomains需要运行时支持,并且 通常相当昂贵。虽然仍由CoreCLR实施, 在.NET Native中不可用,我们不打算添加它 功能在那里。

我进行了测试,并且字符串替换不适用于.Net Core 3.1

因此,您必须自己实现该替换,或者从外部配置文件中读取数据。

,

最终找到了我的解决方案,我在System.Data.SqlClient中使用了不支持 | DataDirectory | AttachDbFilename=。新的 SqlClient Provider 软件包:Microsoft.Data.SqlClient是从现在开始应该使用的软件包,它在|DataDirectory|中支持 AppDomains AttachDbFilename=

用于使用 System.Data.SqlClient ,应使用以下命令检索连接字符串中的数据库位置:AppDomain.CurrentDomain.BaseDirectory 因此System.Data.SqlClient的连接字符串应如下所示:

cstr = @"server=(localdb)\MSSQLLocalDB;AttachDbFilename="+ AppDomain.CurrentDomain.BaseDirectory+"Database.mdf ; Integrated Security = True";

这应该可以解决问题

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...