Сделать соединение SQLite неудачным, если база данных отсутствует? (Удалено / перемещено) - PullRequest
6 голосов
/ 30 апреля 2009

У меня есть следующий метод внутри class DBConnection. Я вызываю метод следующим образом: SQLiteConnection conn = DBConnection.OpenDB();, когда я хочу открыть соединение, чтобы я мог выполнять свои запросы. Я могу вызвать аналогичный метод, когда хочу закрыть соединение.

Метод:

public static SQLiteConnection OpenDB()
{
    try
    {
        //Gets connectionstring from app.config
        string myConnectString =
            ConfigurationManager.ConnectionStrings[
                "LegMedSQLLite.Properties.Settings.LegMedSQLLiteDBConnectionString"].ConnectionString;

        var conn = new SQLiteConnection(myConnectString);

        conn.Open();
        return conn;
    }
    catch (SQLiteException e)
    {
        MessageBox.Show(e.ToString(), "TEST");
        return null;
    }
}

Это все работает отлично и денди. Проблема заключается в том, чтобы попробовать. Представим себе следующий сценарий:

  • Файл базы данных был перемещаются / удалить.

Исключение никогда не будет выброшено. На самом деле, первый улов, на который я наткнулся, - это когда я выполняю свой первый запрос, где он показывает, что таких таблиц нет, и выдает свое собственное исключение. Я был ошеломлен этим странным явлением, но вскоре обнаружил, что SQLite создает новый пусто база данных. Под пустым подразумевается нет таблиц , ничего, просто файл базы данных SQLite с тем же именем, что и у старой базы данных, которая должна была быть там.

Это проблема, я хочу, чтобы приложение узнало, если что-то не так (база данных не найдена, повреждена, используется другим процессом и т. Д.), Как только я попытаюсь вызвать SQLiteConnection conn = DBConnection.OpenDB();.

Естественно, я мог бы попытаться вызвать File.Exists в моем методе, но это не похоже на правильное решение. Любая помощь?

Ответы [ 6 ]

19 голосов
/ 01 мая 2009

По крайней мере, в System.Data.SQLite вы можете добавить «FailIfMissing=True» в строку подключения. SQLiteConnection.Open() выдаст SQLiteException, если файл базы данных не существует.

string ConnectString = "Data Source=file.sdb; FailIfMissing=True";
DbConnection db = new SQLiteConnection(ConnectString);
db.Open(); // Fails if file.sdb does not exist

См. Примеры строк подключения SQLite , чтобы найти другой пример, найдите "Отключить создание базы данных".

2 голосов
/ 01 мая 2009

Если вы хотите обнаружить проблемы с повреждением базы данных при запуске, вы можете выполнить команду

pragma целостность_check;

или

pragma quick_check; (что быстрее, но менее тщательно)

Возвращает одну строку со значением "ok".

В противном случае он сообщит об ошибках, с которыми он столкнулся.

2 голосов
/ 30 апреля 2009

Я не использовал SQLite, но это довольно странное поведение для автоматического создания новой базы данных.

Вы можете просто настроить свой блок try для выполнения Select top 1 * From Table сразу после открытия соединения, если оно работает, отбросить результат и продолжить возвращать объект conn. В случае сбоя обработчик исключений должен сработать.

0 голосов
/ 15 сентября 2016

Для sqlite используйте это: Предположим, у вас есть строка подключения в текстовом поле txtConnSqlite

     Using conn As New System.Data.SQLite.SQLiteConnection(txtConnSqlite.Text)
            Dim FirstIndex As Int32 = txtConnSqlite.Text.IndexOf("Data Source=")
            If FirstIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Dim SecondIndex As Int32 = txtConnSqlite.Text.IndexOf("Version=")
            If SecondIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Dim FilePath As String = txtConnSqlite.Text.Substring(FirstIndex + 12, SecondIndex - FirstIndex - 13)
            If Not IO.File.Exists(FilePath) Then MsgBox("Database file not found", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub
            Try
                conn.Open()
                Dim cmd As New System.Data.SQLite.SQLiteCommand("SELECT * FROM sqlite_master WHERE type='table';", conn)
                Dim reader As System.Data.SQLite.SQLiteDataReader
                cmd.ExecuteReader()
                MsgBox("Success", MsgBoxStyle.Information, "Sqlite")
            Catch ex As Exception
                MsgBox("Connection fail", MsgBoxStyle.Exclamation, "Sqlite")
            End Try
         End Using

Я думаю, что вы можете легко преобразовать его в код C #

0 голосов
/ 30 апреля 2009

Не лови на этом уровне. Вместо этого SQLiteConnection должен реализовывать IDisposable, то есть вы должны просто вернуть открытое соединение и позволить вызывающему коду обрабатывать любые исключения, а также полагаться на метод Dispose для закрытия соединения.

0 голосов
/ 30 апреля 2009

Если нет способа изменить поведение SQLite по умолчанию, то вам, возможно, придется сделать File.Exists. Это было бы лучше, чем подключиться и создать новый файл, проверить, нужна ли вам база данных, а затем удалить новый файл в блоке catch.

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