Hello, I'm just starting to experiment with sqlite and System.Data.SQLite. How 
do they make use of the connection string |DataDirectory| macro? I've found 
lots of references online showing that it is indeed used, but I haven't found 
how to extract the file path from it at runtime.

Given a connection string such as "Data 
Source=|DataDirectory|TestDatabase.sqlite;", I want to be able to create the 
database file if it does not exist, and I want to extract that path from the 
connection string.

In SQL CE, I could do this:

public string GetSqlCeDataSource()
{
    var connectionString = 
ConfigurationManager.ConnectionStrings[ConnectionStringName];
    var factory = DbProviderFactories.GetFactory(connectionString.ProviderName);

    using (var connection = factory.CreateConnection())
    {
        if (connection == null)
        {
            throw new InvalidOperationException(String.Format(
                "Failed to create connection for {0}", 
connectionString.ProviderName));
        }

        connection.ConnectionString = connectionString.ConnectionString;
        return connection.Database;
    }
}

But sqlite returns "main" as the database instead of the file name.

So I worked around it by using a ConnectionStringBuilder and parsing the macro 
myself, but is there a better way to do this?

Here's the workaround (null checks removed for simplicity):

public void EnsureDatabase()
{
    var connectionStringSettings = 
ConfigurationManager.ConnectionStrings[ConnectionStringName];
    var factory = 
DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
    var builder = factory.CreateConnectionStringBuilder();
    builder.ConnectionString = connectionStringSettings.ConnectionString;
    var dataDirectory = 
AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

    string databaseFilePath = builder["Data 
Source"].ToString().Replace("|DataDirectory|", null);
    databaseFilePath = Path.Combine(dataDirectory, databaseFilePath);

    if (!Directory.Exists(dataDirectory))
    {
        Directory.CreateDirectory(dataDirectory);
    }

    if (!File.Exists(databaseFilePath))
    {
       SQLiteConnection.CreateFile(databaseFilePath);
    }
}

Thanks,
Lee

Reply via email to