我使用的是本地数据库,由于某些原因,当我使用|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|
变量有一个由.NET框架基于操作系统设置的值。
我做了一个如下的快速实验。
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
文件,它就可以工作。编辑结束
您可能还需要考虑将连接字符串放入配置文件中,而不是将其硬编码到代码本身中。
我希望我能解释清楚这一点,这将有助于你解决你的问题。