Na plataforma .NET, é mais conveniente implantar soluções Web. Podemos usar o Visual Studio.NET 2003 para adicionar um projeto de instalação WEB, adicionar os principais arquivos de saída e conteúdo do projeto no "Editor do sistema de arquivos" implantado e concluir o programa de instalação com muita facilidade.
No entanto, o programa de instalação criado desta forma instala apenas os arquivos DLL compilados pela página da Web e pelo programa ASP.NET no diretório IIS da máquina de destino. É adequado para aplicativos gerais (como bancos de dados Access, que podem ser empacotados em). o programa de instalação junto. ); Se o banco de dados for SQL SERVER, o banco de dados precisará ser instalado durante a implantação, e o programa de instalação será mais complicado e precisaremos customizar a classe do programa de instalação. Execute o script SQL na classe do instalador e grave a cadeia de conexão em Web.config.
l Instalando o banco de dados
O Microsoft MSDN introduz o estabelecimento de um banco de dados ao implantar aplicativos. Por exemplo:
Este método serve para criar uma classe de instalador e chamá-la na classe de instalador ADO.NET executa instruções SQL (as instruções SQL são colocadas em um arquivo de texto) para criar um banco de dados.
Entretanto, há um problema com esse método. Se você usar o SQL Server2000 para gerar um arquivo de script para todas as tabelas, exibições e procedimentos armazenados e usar o ADO.NET para executar esse arquivo de script, haverá muitas instruções "GO" nele. o script. Ocorreu um erro. Claro, podemos substituir “GO” por um caractere de nova linha e usar o ADO.NET para executar instruções SQL uma por uma. Obviamente, esta eficiência é relativamente baixa.
A melhor maneira é chamar osql para executar o script. (Ou crie um arquivo cmd para um projeto de banco de dados, e o arquivo cmd também chamará osql ao criar o banco de dados).
usando o sistema;
usando System.Collections;
usando System.ComponentModel;
usando System.Configuration.Install;
usando System.Data.SqlClient;
usando System.IO;
usando System.Reflection;
usando System.Diagnostics;
o namespace
System.Xml;
{
/// <resumo>
/// Descrição resumida de DBCustomAction.
/// </sumário>
[RunInstaller (verdadeiro)]
classe pública DBCustomAction: System.Configuration.Install.Installer
{
/// <resumo>
///@autor:overred
/// </sumário>
componentes privados System.ComponentModel.Container = null
;
{
// Esta chamada é exigida pelo designer.
InitializeComponent();
// TODO: Adicione qualquer inicialização após InitializeComponent ser chamado
}
/// <resumo>
/// Limpa todos os recursos em uso.
/// </sumário>
substituição protegida void Dispose( bool disposing)
{
se (descartando)
{
if (componentes! = nulo)
{
componentes.Dispose();
}
}
base.Dispose(disposição);
}
#region Código gerado pelo Designer de Componentes
/// <resumo>
/// O Designer suporta métodos necessários - não use o editor de código para modificar
/// O conteúdo deste método.
/// </sumário>
privado vazio InitializeComponent()
{
componentes = novo System.ComponentModel.Container();
}
#endregion
#region configuração personalizada
private void ExecuteSql(string connString,string DatabaseName,string sql)
{
SqlConnection conn=new SqlConnection(connString);
SqlCommand cmd=new SqlCommand(sql,conn);
conexão.Open();
cmd.Connection.ChangeDatabase(NomeBancoDeDados);
tentar
{
cmd.ExecuteNonQuery();
}
pegar(Exceção e)
{
StreamWriter w=new StreamWriter(@"e:\log.txt",true);
w.WriteLine("===em ExecuteSql======");
w.WriteLine(e.ToString());
w.Fechar();
}
finalmente
{
conexão.Fechar();
}
}
substituição pública void Install (IDictionary stateSaver)
{
criarDB();
updateConfig();
}
private void createDB()
{
tentar
{
string connString=string.Format("servidor={0};id do usuário={1};senha={2}",this.Context.Parameters["servidor"],this.Context.Parameters["usuário"], this.Context.Parameters["pwd"]);
//Cria um banco de dados com base no nome do banco de dados inserido.
ExecuteSql(connString,"master","create database "+this.Context.Parameters["dbname"]);
//Chamando osql para executar o script
string cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql",this.Context.Parameters["servidor"],este .Context.Parameters["usuário"],this.Context.Parameters["pwd"],this.Context.Parameters["nome do banco de dados"],this.Context.Parameters["targetdir"]);
System.Diagnostics.Process sqlProcess=novo Processo();
sqlProcess.StartInfo.FileName="osql.exe";
sqlProcess.StartInfo.Arguments=cmd;
sqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlProcess.Start();
sqlProcess.WaitForExit();//Aguardando execução
sqlProcess.Close();
//Excluir arquivo de script
System.IO.FileInfo sqlFileInfo=new FileInfo(string.Format("{0}db.sql",this.Context.Parameters["targetdir"]));
if(sqlFileInfo.Exists)
sqlFileInfo.Delete();
}
pegar(Exceção e)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===na instalação======");
w.WriteLine(e.ToString());
w.Fechar();
}
}
private void updateConfig()
{
tentar
{
//Escreve a string de conexão em Web.config
System.IO.FileInfo fileInfo=new FileInfo(string.Format("{0}web.config",this.Context.Parameters["targetdir"]))
;
throw new InstallException("não foi possível encontrar o web.config")
;
doc.Load(fileInfo.NomeCompleto);
bool encontradoIt=false;
string connString=string.Format("servidor={0};banco de dados={1};id do usuário={2};senha={3}",this.Context.Parameters["servidor"], this.Context.Parameters["dbname"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]
)
;
("//appSettings/add[@key='connString']");
se(não!=nulo)
{
no.Attributes.GetNamedItem("valor").Value=enCS;
encontrado=verdadeiro;
}
if(!encontrado)
throw new InstallException("não foi possível encontrar a configuração connString ");
doc.Save(fileInfo.NomeCompleto);
}
pegar(Exceção e)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===na atualização connstring=tjtj=====");
w.WriteLine(e.ToString());
w.WriteLine(e.StackTrace);
w.Fechar();
}
}
#endregion
}
}