Резервное копирование базы данных SQLite с помощью SaveFileDialog? - PullRequest
0 голосов
/ 15 сентября 2018

Я следую инструкциям, приведенным здесь:

Sqlite Online Backup с использованием System.Data.Sqlite

И это работает, как я ожидал, но я бы хотел передать файл BackupDb.db в SaveFileDialog, чтобы пользователь мог сохранить файл вне папки приложений, предпочтительно на внешнем диске. Я просто не могу понять это.

Это то, что я имею до сих пор:

private void btn_backup_db_Click(object sender, RoutedEventArgs e)
    {
        var ofd1 = new Microsoft.Win32.SaveFileDialog();
        using (var source = new SQLiteConnection("Data Source=database.db; Version=3;"))
        using (var destination = new SQLiteConnection("Data Source=BackupDb.db; Version=3;"))
        {
            source.Open();
            destination.Open();
            source.BackupDatabase(destination, "main", "main", -1, null, 0);
            //Microsoft.Win32.SaveFileDialog saveFileDialog;
            ofd1.ShowDialog();
        }

Я знаю, что пропускаю шаг, но я не уверен, какой шаг. У меня есть переменная ofd1, определенная как открывающая SaveFileDialog, и я говорю, чтобы она открывалась с of1.ShowDialog (); но я не могу передать "main" или "destination" в SaveFileDialog, потому что SQLite не имеет определения для отображения диалога.

Я пытаюсь получить путь к файлу, используя:

        private string MyDirectory()
   {
        return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
   }

Но я получаю исключение, утверждающее, что у меня нет доступа на чтение к каталогу.

Итак, я переключился на это, но я не уверен, как правильно его использовать. Он указывает на базовый каталог, но не может найти ничего в bin \ debug:

var dir = AppDomain.CurrentDomain.BaseDirectory;

В итоге это был ответ, я включил все из btn_backup_db_Click:

   private void btn_backup_db_Click(object sender, RoutedEventArgs e)
    {

        var ofd1 = new Microsoft.Win32.SaveFileDialog();
        ofd1.Filter = "Database Files (*.db)|*.db";
        ofd1.FileName = "database";
            // customize file dialog properties here

            if (ofd1.ShowDialog() == true)
            {

            var path = Path.GetFullPath(ofd1.FileName);
            var destinationCnx = "Data Source=" + path + "; Version=3;";
            using (var source = new SQLiteConnection("Data Source=database.db; Version=3;"))
            using (var destination = new SQLiteConnection(destinationCnx))
            {
                source.Open();
                destination.Open();
                source.BackupDatabase(destination, "main", "main", -1, null, 0);
            }
            }
        else
        {
            MessageBox.Show("Error");
        }
    }

Большое спасибо всем!

1 Ответ

0 голосов
/ 16 сентября 2018

Класс SaveFileDialog - это всего лишь утилита, позволяющая пользователю выбрать, где он хочет сохранить файл (в форме пути).

Подводя итог, вам нужно отобразить диалоговое окно файла, прежде чем делать что-либо с sqlite. Когда вы получите путь, вам нужно создать обратную строку соединения.

var ofd1 = new SaveFileDialog();
// customize file dialog properties here

if (ofd1.ShowDialog() == true)
{
    var path = Path.GetFullPath(ofd1.FileName);
    var destinationCnx = "Data Source=" + path + "; Version=3;"

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