我正在使用本地数据库,由于某种原因,当我使用|DataDirectory|
时,添加/删除数据库不会更新
SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
DataSet ds = new DataSet();
但是,如果我使用以下目录,则它确实有效
SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=F:\Project\Home_Database\HomeDB.mdf;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
DataSet ds = new DataSet();
有人知道为什么吗?
答案 0 :(得分:2)
|DataDirectory|
变量具有由.NET Framework基于操作系统设置的值。
我对此做了一个快速实验。
class Program
{
static void Main(string[] args)
{
var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory");
Console.WriteLine(dataDirectory);
Console.ReadKey();
}
}
当我运行以上代码时,它什么也没显示。调试后,我发现dataDirectory
变量的值为null
。
然后我尝试使用它来创建数据库连接并打开它。
SqlConnection conn = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");
conn.Open();
此代码在conn.Open();
失败,并出现以下错误。
尝试为文件D:\ Chetan \ Sandbox \ consoleapp1 \ ConsoleApp1 \ bin \ Debug \ HomeDB.mdf附加自动命名的数据库失败。存在具有相同名称的数据库,或者无法打开指定的文件,或者该文件位于UNC共享上。
从错误中可以看到,由于'|DataDirectory|
为空,因此应用程序尝试将.mdf
文件定位在项目目录下的bin\Debug
文件夹中,该目录基本上是该位置从exe的运行位置开始。
因此,如果您希望|DataDirectory|
具有不同的值,则首先需要对其进行更改,然后再使用它。如下。
class Program
{
static void Main(string[] args)
{
var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory");
//Changing DataDirectory value.
AppDomain.CurrentDomain.SetData("DataDirectory", "C:\\DataFiles");
Console.WriteLine(dataDirectory);
SqlConnection conn = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");
conn.Open();
Console.ReadKey();
}
}
使用此代码,我注意到使用值"C:\\DataFiles"
来定位HomeDB.mdf
。
如果您阅读This,则会说明|DataDirectory|
的值扩展的顺序。
This解释了如何自定义|DataDirectory|
的值。
现在您的数据问题没有得到反映。
在您的情况下,|DataDirectory|
的值为空,因此它正在连接到位于HomeDB.mdf
或bin\Debug
文件夹中的bin\Release
文件,并在您查找时进行更改在F:\Project\Home_Database\HomeDB.mdf
处进行验证。
您没有看到我看到的错误,因为在构建项目时将.mdf文件复制到可执行位置。
因此,解决您的问题的方法是使用|DataDirectory|
方法更改AppDomain.CurrentDomain.SetData("DataDirectory",<<yourvalue>>);
的值。
编辑:
如果.mdf
文件的位置相对于项目的可执行文件是固定的,则可以在运行时构建|DataDirectory|
的值并对其进行分配。
比方说,您在Database
所在的位置有一个文件夹exe
,而Database
的文件夹中有HomeDB.mdf
个文件。因此,首先您需要找到运行exe
的路径并将Database
附加到is并将其分配给|DataDirectory|
。
//Get the current path from where the exe is running.
var currentDirectory = AppDomain.CurrentDomain.BaseDirectory;
//Build path to Database folder
var databasePath = currentDirectory + "Database";
//Assign it to DataDirectory
AppDomain.CurrentDomain.SetData("DataDirectory", databasePath);
var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory");
Console.WriteLine(dataDirectory);
//Use DataDirectory to SQL Connection.
SqlConnection conn = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");
conn.Open();
无论您从何处运行应用程序,此操作都不会出现任何问题。只要您拥有Database
文件夹和该文件夹中的HomeDB.mdf
文件,它就可以工作。
编辑结束
您可能还需要考虑将连接字符串放入配置文件中,而不是将其硬编码为代码本身。
我希望我能够清楚地解释这一点,这将帮助您解决问题。