Anteriormente usaba un método algo "brusco" para conseguir crear la base de datos y el esquema correspondiente durante la instalación de una aplicación. Sin embargo, hace poco acabo de enterarme a través de un blog de una forma más elegante de hacer esto para base de datos SQL Server; lo único que se necesita es crear un instalador personalizado y hacer uso de los ensamblados que provee SQL Server Management Objects:
{
private readonly string sqlScript_;
public SqlScriptInstaller(string sqlScript)
{
this.sqlScript_ = sqlScript;
}
public SqlScriptInstaller(Stream sqlStream)
{
using (StreamReader sr = new StreamReader(sqlStream))
{
this.sqlScript_ = sr.ReadToEnd();
}
}
public override void Install(IDictionary stateSaver)
{
string connectionString = this.Context.Parameters["ConnectionString"];
using (SqlConnection conn = new SqlConnection(connectionString))
{
ServerConnection serverConn = new ServerConnection(conn);
Server sqlServer = new Server(serverConn);
sqlServer.ConnectionContext.ExecuteNonQuery(this.sqlScript_);
}
base.Install(stateSaver);
}
}
El script que acompañe a la aplicación puede incluir múltiples sentencias Transact-SQL (incluyendo la sentencia GO).