我正在使用本地数据库,由于某种原因,当我使用时|DataDirectory|,添加/删除时数据库不会更新
|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();
有人知道为什么吗?
|DataDirectory| 变量具有基于OS的.NET Framework设置的值。
我对此做了一个快速实验。
class Program { static void Main(string[] args) { var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory"); Console.WriteLine(dataDirectory); Console.ReadKey(); } }
当我运行上面的代码时,它什么也没显示。调试后,我发现该dataDirectory变量具有值null。
dataDirectory
null
然后,我尝试使用它来创建数据库连接并打开它。
SqlConnection conn = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True"); conn.Open();
此代码失败,conn.Open();并出现以下错误。
conn.Open();
尝试为文件D:\ Chetan \ Sandbox \ consoleapp1 \ ConsoleApp1 \ bin \ Debug \ HomeDB.mdf附加自动命名的数据库失败。存在具有相同名称的数据库,或者无法打开指定的文件,或者该数据库位于UNC共享上。
从错误中可以看到,由于’|DataDirectory|为null,应用程序尝试将.mdf文件定位bin\Debug在项目目录下的文件夹中,该目录基本上是exe运行的位置。
.mdf
bin\Debug
因此,如果您希望|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。
"C:\\DataFiles"
HomeDB.mdf
如果您阅读此内容,则会说明的值|DataDirectory|扩展的顺序。
这说明了如何自定义的值|DataDirectory|。
现在,您的数据问题没有得到反映。
在您的情况下,|DataDirectory|其值为null,因此它正在连接到HomeDB.mdf位于bin\Debug或bin\Release文件夹中的文件,并在其中进行更改,同时您F:\Project\Home_Database\HomeDB.mdf要验证更改。
bin\Release
F:\Project\Home_Database\HomeDB.mdf
您没有看到我看到的错误,因为在构建项目时将.mdf文件复制到可执行位置。
因此,解决您的问题的方法是更改|DataDirectory|usingAppDomain.CurrentDomain.SetData("DataDirectory",<<yourvalue>>);方法的值。
AppDomain.CurrentDomain.SetData("DataDirectory",<<yourvalue>>);
编辑:
如果.mdf文件的位置相对于项目的可执行文件是固定的,则可以|DataDirectory|在运行时构建值并进行分配。
假设您的文件夹Database与exeandDatabase文件夹位于同一位置HomeDB.mdf。因此,首先您需要找到exe运行的路径并将其追加Database到并将其分配给|DataDirectory|。
Database
exe
//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文件,它就会起作用。
编辑结束
您可能还需要考虑将连接字符串放在配置文件中,而不是将其硬编码到代码本身中。
我希望我能够清楚地解释这一点,这将有助于您解决问题。