/// <summary>
 /// Abstract method that inheritors must override to return a new instance of
 /// the provider specific database statement builder
 /// </summary>
 /// <param name="forDatabase">The database (and contained connection) that the builder must generate statements for</param>
 /// <param name="withProperties">The properties of the database.</param>
 /// <param name="writer">The TextWriter the statement builder uses to output the SQL statemtent to.</param>
 /// <param name="ownsWriter">true if the new instance owns the text writer and should dispose of it when the builder is disposed</param>
 /// <returns>A new DBStatementBuilder subclass</returns>
 protected abstract DBStatementBuilder CreateStatementBuilder(DBDatabase forDatabase, DBDatabaseProperties withProperties, System.IO.TextWriter writer, bool ownsWriter);
 /// <summary>
 /// Abstract method that inheritors must override to return a new instance of
 /// the provider specific database schema provider
 /// </summary>
 /// <param name="forDatabase">The database (and contained connection) that the builder must generate statements for</param>
 /// <param name="properties">The properties of the database.</param>
 /// <returns>A new schema provider</returns>
 protected abstract DBSchemaProvider CreateSchemaProvider(DBDatabase forDatabase, DBDatabaseProperties properties);
        //
        // abstract methods
        //

        /// <summary>
        /// Abstract method that inheritors must override to return a new instance of
        /// the provider specific database properties
        /// </summary>
        /// <param name="forDatabase">The database (and contained connection) that the properties must represent</param>
        /// <returns>A new instance of the DBDatabaseProperties</returns>
        protected abstract DBDatabaseProperties GetPropertiesFromDb(DBDatabase forDatabase);