Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make SQLite connection fail if database is missing? (deleted/moved)

Tags:

c#

sqlite

I have the following method inside class DBConnection. I call the method like this: SQLiteConnection conn = DBConnection.OpenDB(); when I want to open an connection, so that I can execute my queries. I can call a similar method when I want to close the connection.

The method:

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;
    }
}

This all works fine and dandy. The problem is the try-catch though. Let us imagine the following scenario:

  • The database file has been moved/delete.

The exception will never be thrown. Actually, the first catch I stumble upon is when I execute my first query - where it figures that there is no such table(s) and it throws its own exception. I was stunned by this weird phenomenon, but I soon found out that SQLite creates a new empty database. By empty is mean no tables, nothing, just an SQLite database file with the same name as the old database which was supposed to be there.

This is an issue, I want the application to know if there is something wrong (database not found, corrupted, being used by another process etc.) as soon as I try to call SQLiteConnection conn = DBConnection.OpenDB();.

Naturally, I could try call a File.Exists in my method, but that doesn't seem like a proper solution. Any help?

like image 943
CasperT Avatar asked Apr 30 '09 14:04

CasperT


2 Answers

If you're using System.Data.SQLite, you can add "FailIfMissing=True" to your connection string. SQLiteConnection.Open() will throw a SQLiteException if the database file does not exist.

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

See SQLite Connection String Samples for another example, look for "Disable create database behaviour".

If you're using Microsoft.Data.Sqlite, you can specify an open mode with Mode=ReadWrite instead of Mode=ReadWriteCreate.

like image 71
Stephen Jennings Avatar answered Sep 30 '22 16:09

Stephen Jennings


I haven't used SQLite but that is pretty bizarre behaviour to auto create a brand new database.

You could just adjust your try block to do a Select top 1 * From Table immediately after you open the connection, if it works, throw away the result and continue to return your conn object. If it fails, the exception handler should fire.

like image 39
Eoin Campbell Avatar answered Sep 30 '22 17:09

Eoin Campbell