I use System.Data.SqlServer.SqlCeEngine() quite a lot in all my projects. I normally create the database on the fly when the application is launched for the first time and then I populate the initial data via a web service.

I often check if database objects exist before I create them. You can do this by querying the INFORMATION_SCHEMA views. I created a helper class called SqlCeEngineEx that contains the following methods for querying the INFORMATION_SCHEMA:

  1. bool DoesTableExist(string table) - Checks if a table exists in the database
  2. string[] GetTables() - Returns a string array of all the tables in the database
  3. string[] GetTableConstraints(string table) - Returns a string array of all the constraints for a table
  4. string[] GetTableConstraints() - Returns a string array of all the constraints in the database

And here is the full code:

public class SqlCeEngineEx : IDisposable
{
    private SqlCeEngine engine;

    public SqlCeEngineEx()
    {
        engine = new SqlCeEngine();
    }

    public SqlCeEngineEx(string connectionString)
    {
        engine = new SqlCeEngine(connectionString);
    }

    public bool DoesTableExist(string tablename)
    {
        bool result = false;

        using (SqlCeConnection conn = new SqlCeConnection(LocalConnectionString))
        {
            conn.Open();
            using (SqlCeCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText =
                    @"SELECT COUNT(TABLE_NAME)
                      FROM INFORMATION_SCHEMA.TABLES
                      WHERE TABLE_NAME=@Name";
                cmd.Parameters.AddWithValue("@Name", tablename);
                result = Convert.ToBoolean(cmd.ExecuteScalar());
            }
        }

        return result;
    }

    private string[] PopulateStringList(SqlCeCommand cmd)
    {
        List<string> list = new List<string>();

        using (SqlCeDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                list.Add(reader.GetString(0));
            }
        }

        return list.ToArray();
    }

    public string[] GetTables()
    {
        string[] tables;

        using (SqlCeConnection conn = new SqlCeConnection(LocalConnectionString))
        {
            conn.Open();
            using (SqlCeCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES";
                tables = PopulateStringList(cmd);
            }
        }

        return tables;
    }

    public string[] GetTableConstraints()
    {
        string[] constraints;

        using (SqlCeConnection conn = new SqlCeConnection(LocalConnectionString))
        {
            conn.Open();
            using (SqlCeCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS";
                constraints = PopulateStringList(cmd);
            }
        }

        return constraints;
    }

    public string[] GetTableConstraints(string tablename)
    {
        string[] constraints;

        using (SqlCeConnection conn = new SqlCeConnection(LocalConnectionString))
        {
            conn.Open();
            using (SqlCeCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText =
                    @"SELECT CONSTRAINT_NAME
                      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                      WHERE TABLE_NAME=@Name";
                cmd.Parameters.AddWithValue("@Name", tablename);
                constraints = PopulateStringList(cmd);
            }
        }

        return constraints;
    }

    public string LocalConnectionString
    {
        get { return engine.LocalConnectionString; }
        set { engine.LocalConnectionString = value; }
    }

    public void Compact()
    {
        engine.Compact(null);
    }

    public void Compact(string connectionString)
    {
        engine.Compact(connectionString);
    }

    public void CreateDatabase()
    {
        engine.CreateDatabase();
    }

    public void Repair(string connectionString, RepairOption options)
    {
        engine.Repair(connectionString, options);
    }

    public void Shrink()
    {
        engine.Shrink();
    }

    public bool Verify()
    {
        return engine.Verify();
    }

    public void Dispose()
    {
        engine.Dispose();
        engine = null;
    }
}