问题描述
我安装了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";
这应该可以解决问题