2009-04-30 2 views
5

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

Метод:

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 в моем методе, но это не похоже на правильное решение. Любая помощь?

ответ

17

По крайней мере, в 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 Connection String Samples для другого примера, обратите внимание на «Отключить создание базы данных поведения».

2

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

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

+1

Да, я думал, что это было так хорошо! Но это не похоже на System.Data.SQLite, который делает это. Я знаю, что использование веб-серверов SQLite делает то же самое. Кроме того, я также думал о идее SQL-запроса, но это просто кажется пустой тратой. Я обязательно буду отмечать ваш ответ как принятый ответ, если нет «правильного» способа сделать это. – CasperT

-2

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

-1

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

1

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

ргадта integrity_check;

или

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

Это возвращает одну строку со значением «ok».

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

0

Для 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 

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

Смежные вопросы