gpt4 book ai didi

使用 |DataDirectory| 时 C# 本地数据库未更新

转载 作者:搜寻专家 更新时间:2023-10-30 20:14:11 24 4
gpt4 key购买 nike

我正在使用本地数据库,由于某些原因,当我使用 |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 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(); 处失败出现以下错误。

An attempt to attach an auto-named database for file D:\Chetan\Sandbox\consoleapp1\ConsoleApp1\bin\Debug\HomeDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

正如您从错误中看到的那样,因为 ' |DataDirectory|为空,应用程序尝试定位 .mdf文件在 bin\Debug项目目录下的文件夹,基本上是 exe 运行的位置。

所以如果你想要 |DataDirectory|有不同的值(value),你首先需要改变它才能使用它。如下。

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| 的值.

现在来谈谈您的数据未反射(reflect)的问题。

在你的例子中,|DataDirectory|有空值,所以它连接到 HomeDB.mdf文件位于 bin\Debugbin\Release当您查看 F:\Project\Home_Database\HomeDB.mdf 时,文件夹在那里进行更改验证更改。

您没有看到我看到的错误,因为在构建项目时 .mdf 文件被复制到可执行位置。

因此,解决您的问题的方法是更改​​ |DataDirectory| 的值使用 AppDomain.CurrentDomain.SetData("DataDirectory",<<yourvalue>>);方法。

编辑:

如果.mdf的位置文件相对于项目的可执行文件是固定的,您可以为|DataDirectory|构建值在运行时并分配它。

假设,您有一个文件夹 Database在与 exe 相同的位置和 Database文件夹有HomeDB.mdf文件。所以首先你需要找到 exe 所在的路径正在运行并附加 Database to 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该文件夹中的文件。

编辑结束

您可能还需要考虑将连接字符串放在配置文件中,而不是将其硬编码到代码本身。

我希望我能够清楚地解释这一点,这将有助于您解决问题。

关于使用 |DataDirectory| 时 C# 本地数据库未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com