Bajo la plataforma .NET, es más conveniente implementar soluciones web. Podemos usar Visual Studio.NET 2003 para agregar un proyecto de instalación WEB, agregar los archivos principales de salida y contenido del proyecto en el "Editor del sistema de archivos" implementado y completar el programa de instalación muy fácilmente.
Sin embargo, el programa de instalación creado de esta manera solo instala los archivos DLL compilados por la página web y el programa ASP.NET en el directorio IIS de la máquina de destino. Es adecuado para aplicaciones generales (como bases de datos de Access, que se pueden empaquetar). el programa de instalación juntos. ); Si la base de datos es SQL SERVER, la base de datos debe instalarse durante la implementación, el programa de instalación será más complicado y debemos personalizar la clase del programa de instalación. Ejecute el script SQL en la clase de instalador y escriba la cadena de conexión en Web.config.
l Instalación de la base de datos
Microsoft MSDN introduce el establecimiento de una base de datos al implementar aplicaciones. Por ejemplo:
Este método consiste en crear una clase de instalador y llamarla en la clase de instalador. ADO.NET ejecuta declaraciones SQL (las declaraciones SQL se colocan en un archivo de texto) para crear una base de datos.
Sin embargo, hay un problema con este método si usa SQL Server2000 para generar un archivo de secuencia de comandos para todas las tablas, vistas y procedimientos almacenados, y usa ADO.NET para ejecutar este archivo de secuencia de comandos, habrá muchas declaraciones "GO" en. Se produjo un error. Por supuesto, podemos reemplazar "GO" con un carácter de nueva línea y usar ADO.NET para ejecutar declaraciones SQL una por una. Evidentemente, esta eficiencia es relativamente baja.
La mejor manera es llamar a osql para ejecutar el script. (O cree un archivo cmd para un proyecto de base de datos, y el archivo cmd también llama a osql al crear la base de datos).
usando Sistema;
usando System.Collections;
usando System.ComponentModel;
usando System.Configuration.Install;
usando System.Data.SqlClient;
usando System.IO;
usando System.Reflection;
utilizando System.Diagnostics;
usando System.Xml
espacio de nombres DBCustomAction;
{
/// <resumen>
/// Descripción resumida de DBCustomAction.
/// </summary>
[EjecutarInstaller(verdadero)]
clase pública DBCustomAction: System.Configuration.Install.Installer
{
/// <resumen>
///@autor:sobrerojo
/// </summary>
componentes privados System.ComponentModel.Container = nulo;
público DBCustomAction();
{
// Esta llamada es requerida por el diseñador.
InitializeComponent();
// TODO: Agregar cualquier inicialización después de llamar a InitializeComponent
}
/// <resumen>
/// Limpiar todos los recursos en uso.
/// </summary>
anulación protegida void Dispose (bool disposing)
{
si (desechando)
{
si (componentes! = nulo)
{
componentes.Dispose();
}
}
base.Dispose(eliminar);
}
#region Código generado por el Diseñador de componentes
/// <resumen>
/// Designer admite los métodos requeridos; no use el editor de código para modificar
/// El contenido de este método.
/// </summary>
vacío privado InicializarComponente()
{
componentes = nuevo System.ComponentModel.Container();
}
#endregion
#región configuración personalizada
Private void ExecuteSql (cadena connString, cadena Nombre de la base de datos, cadena sql)
{
Conexión SqlConnection=nueva Conexión Sql(cadenaconn);
SqlCommand cmd=nuevo SqlCommand(sql,conn);
conexión.Open();
cmd.Connection.ChangeDatabase(Nombre de la base de datos);
intentar
{
cmd.ExecuteNonQuery();
}
captura (Excepción e)
{
StreamWriter w=nuevo StreamWriter(@"e:\log.txt",true);
w.WriteLine("===en ExecuteSql======");
w.WriteLine(e.ToString());
w.Cerrar();
}
finalmente
{
conexión.Cerrar();
}
}
anulación pública instalación nula (IDictionary stateSaver)
{
crearDB();
actualizarConfig();
}
vacío privado createDB()
{
intentar
{
string connString=string.Format("servidor={0};id de usuario={1};contraseña={2}",this.Context.Parameters["servidor"],this.Context.Parameters["usuario"], this.Context.Parameters["pwd"]);
//Crea una base de datos basada en el nombre de la base de datos ingresado.
ExecuteSql(connString,"master","create Database "+this.Context.Parameters["dbname"]
// Llamando a osql para ejecutar el script
string cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql",this.Context.Parameters["server"],this .Context.Parameters["usuario"],this.Context.Parameters["pwd"],this.Context.Parameters["dbname"],this.Context.Parameters["targetdir"]);
System.Diagnostics.Process sqlProcess=nuevo proceso();
sqlProcess.StartInfo.FileName="osql.exe";
sqlProcess.StartInfo.Arguments=cmd;
sqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlProcess.Inicio();
sqlProcess.WaitForExit();//Esperando ejecución
sqlProcess.Close();
//Eliminar archivo de script
System.IO.FileInfo sqlFileInfo=new FileInfo(string.Format("{0}db.sql",this.Context.Parameters["targetdir"]));
si(sqlFileInfo.Exists)
sqlFileInfo.Delete();
}
captura (Excepción e)
{
StreamWriter w=nuevo StreamWriter(@"e:log.txt",true);
w.WriteLine("===en Instalar======");
w.WriteLine(e.ToString());
w.Cerrar();
}
}
actualización de vacío privadoConfig()
{
intentar
{
//Escribe la cadena de conexión en Web.config
System.IO.FileInfo fileInfo=new FileInfo(string.Format("{0}web.config",this.Context.Parameters["targetdir"]));
if(!fileInfo.Exists)
lanzar nueva InstallException("no puedo encontrar el archivo web.config")
;
doc.Load(fileInfo.FullName);
bool foundIt=false;
string connString=string.Format("servidor={0};base de datos={1};id de usuario={2};contraseña={3}",this.Context.Parameters["servidor"], this.Context.Parameters["dbname"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]);
cadena enCS=SecurityHelper.EncryptDBConnectionString(connString
no=doc.SelectSingleNode
);("//appSettings/add[@key='connString']");
si(no!=nulo)
{
no.Attributes.GetNamedItem("valor").Value=enCS;
encontrado=verdadero;
}
si (! encontrado)
throw new InstallException ("no puedo encontrar la configuración de connString");
doc.Save(fileInfo.FullName);
}
captura (Excepción e)
{
StreamWriter w=nuevo StreamWriter(@"e:log.txt",true);
w.WriteLine("===in updata connstring=tjtj=====");
w.WriteLine(e.ToString());
w.WriteLine(e.StackTrace);
w.Cerrar();
}
}
#endregion
}
}