C # локальная база данных не обновляется при использовании | DataDirectory | - PullRequest
0 голосов
/ 06 декабря 2018

Я использую локальную базу данных и по какой-то причине, когда я использую |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();

Кто-нибудь может знать, почему?

1 Ответ

0 голосов
/ 06 декабря 2018

|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

Вы также можете рассмотреть возможность подключенияСтрока в файле конфигурации вместо жесткого кодирования в самом коде.

Надеюсь, я смог четко объяснить суть, и это поможет вам решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...