|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
в каталоге проекта, который в основном является местоположением, из которого запускается исполняемый файл.
Так что, если вы хотите, чтобы |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
.
Если вы читаете Это объясняетпорядок, в котором раскрываются значения |DataDirectory|
.
Это объясняет, как настроить значение |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
и присвоить его |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
в этой папке.
EDIT END
Вы также можете рассмотреть возможность подключенияСтрока в файле конфигурации вместо жесткого кодирования в самом коде.
Надеюсь, я смог четко объяснить суть, и это поможет вам решить вашу проблему.