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