C# SQLite Как удалить файл базы данных?

186
29 апреля 2019, 05:50

Намеренно удаляю базу данных, делаю запрос и обрабатываю ошибки, и остается от БД

Как удалять этот файл?

protected bool Delete() {
  using(var connection = new SQLiteConnection(Globals.connection)) {
    try {
      connection.Open();
    }
    catch(SQLiteException) {
      connection.Close();
      return false;
    }
    using(var command = new SQLiteCommand("DELETE FROM system_events", connection)) {
      try { 
        if(command.ExecuteNonQuery() == 0) {
          connection.Close();
          try {
            File.Delete(Directory.GetCurrentDirectory() + "\\db\\db.db");
          } catch (Exception) {
          }
          return false;
        }
      } catch(SQLiteException) {
        connection.Close();
        try {
            File.Delete(Directory.GetCurrentDirectory() + "\\db\\db.db");
        } catch (Exception) {
        }
        return false;
      }
    }
    connection.Close();
  }
  return true;  
}
Answer 1

Команда DELETE удаляет данные, но не саму базу данных.

Окроме того это нормально что остается пустой файл размером в 0 байт. Это то же самое, что создать пустой текстовый документ, сохранить там 0 символов и жаловаться что операционка не удалила сам файл, хотя он, вроде как, пустой и должен удалиться...

Сам файл БД при удалении данных из БД удалятся НЕ ДОЛЖЕН даже в теории.

Раз уж ты имеешь желание удалить сам файл базы данных, то нужно использовать File.Delete(@"\db\db.db"); -- то есть банальное удаление файла через файловую систему операционки.

UnauthorizedAccessException может возникать в случаях:

  • если база данных сейчас используется. То есть нужно сначала закрыть Connection к базе данных (полностью отключится от нее), а потом удалить сам файл.
  • Если база данных размещается там, куда пользователь (от имени которого запущена прога) не имеет доступа. Решение: или разместить прогу туда, куда есть доступ у простого пользователя, или же запускай саму апликуху(и вижуалку) от имени администратора.

Пример кода:

protected bool Delete() {
    //Пытаемся отключить конекшн к БД если он открыт.
    try {
        _connection.Close(); //_connection -- глобальная переменная класса. Эта переменная должна использоваться и в других местах! И открываться конекшн должен только из одного места. НЕ НУЖНО ПЛОДИТЬ ПОДКЛЮЧЕНИЯ К БД
    catch(SQLiteException) {
        //Ошибка здесь не важна. Если он закрыт, значит уже прекрасно!
    }
    try {
        //Наш коннекшн закрыт. Можем смело удалять сам файл.
        File.Delete(Directory.GetCurrentDirectory() + "\\db\\db.db");
        return true;//Ура! Нам удалось удалить файл!
    } catch (Exception) {
    }
    //Во всех иных случаях мы потерпели неудачу
    return false;  
}

Не забываем что желательно прога должна запускаться от имени админа компа, если какие-то хитрые настройки доступа в операционной системе!

READ ALSO
Неясности с интерфейсом (interface)

Неясности с интерфейсом (interface)

Объясните, что в данном примере обозначает параметр <T>, и в чем будет коренная разница от реализации данной ниже?

155
При обновлении БД (MSSQL) возникает ошибка &ldquo;There is already an object named &#39;Weapons&#39; in the database.&rdquo;

При обновлении БД (MSSQL) возникает ошибка “There is already an object named 'Weapons' in the database.”

При запуске команды update-database происходит ошибка:

163
Перевести sql запрос в Laravel с помощью Eloquent ORM или Query Builder

Перевести sql запрос в Laravel с помощью Eloquent ORM или Query Builder

Есть 3 таблицы (CAT_OBL, CAT_STATION, TOS_MES), 1-я и 2-я связаны между собой по полю OBL_ID, 2-я и 3-я таблицы связанны по полю IND_STНужно вывести данные из 3-й таблицы...

164
Как установить эти модули через ispmanager?

Как установить эти модули через ispmanager?

Подскажите, как в панели (5 версия) установить gmpobject, strlen, sprintf, ip2long, serialize, unserialize, crypt, parse_str, json_encode, strtr, strstr, round, parse_url, simplexml_load_string, array_search ? Есть...

143