На платформе .NET удобнее развертывать веб-решения. Мы можем использовать Visual Studio.NET 2003 для добавления проекта веб-установки, добавления основных выходных файлов и файлов содержимого проекта в развернутый «Редактор файловой системы» и очень легко завершить программу установки.
Однако созданная таким образом программа установки устанавливает только файлы DLL, скомпилированные веб-страницей и программой ASP.NET, в каталог IIS целевого компьютера. Она подходит для обычных приложений (таких как базы данных Access, которые можно упаковать в файлы). программу установки вместе.); Если база данных представляет собой SQL SERVER, ее необходимо установить во время развертывания, и программа установки будет более сложной, и нам необходимо настроить класс программы установки. Выполните сценарий SQL в классе установщика и запишите строку подключения в Web.config.
l Установка базы данных
Microsoft MSDN представляет возможность создания базы данных при развертывании приложений. Например:
Этот метод предназначен для создания класса установщика и вызова его в классе установщика. ADO.NET выполняет инструкции SQL (операторы SQL помещаются в текстовый файл) для создания базы данных.
Однако с этим методом возникает проблема. Если вы используете SQL Server2000 для создания файла сценария для всех таблиц, представлений и хранимых процедур и используете ADO.NET для выполнения этого файла сценария, в нем будет много операторов «GO». произошла ошибка. Конечно, мы можем заменить «GO» символом новой строки и использовать ADO.NET для выполнения операторов SQL один за другим. Очевидно, что эта эффективность сравнительно невелика.
Лучший способ — вызвать osql для выполнения сценария. (Или создайте файл cmd для проекта базы данных, и файл cmd также вызывает osql при создании базы данных).
использование системы;
использование System.Collections;
использование System.ComponentModel;
используя System.Configuration.Install;
использование System.Data.SqlClient;
использование System.IO;
использование System.Reflection;
использование System.Diagnostics;
использование пространства имен System.Xml
DBCustomAction
;
{
/// <сводка>
/// Краткое описание DBCustomAction.
/// </сводка>
[Выполнить установщик(истина)]
общедоступный класс DBCustomAction: System.Configuration.Install.Installer
{
/// <сводка>
///@автор:overred
/// </сводка>
частные компоненты System.ComponentModel.Container = null
public DBCustomAction();
{
// Этот вызов необходим дизайнеру.
InitializeComponent();
// TODO: добавить любую инициализацию после вызова InitializeComponent.
}
/// <сводка>
/// Очистка всех используемых ресурсов.
/// </сводка>
защищенное переопределение void Dispose (удаление bool)
{
если (удаление)
{
если (компоненты! = ноль)
{
компоненты.Dispose();
}
}
base.Dispose(утилизация);
}
#region Код, сгенерированный дизайнером компонентов
/// <сводка>
/// Конструктор поддерживает необходимые методы — не используйте редактор кода для изменения
/// Содержимое этого метода.
/// </сводка>
частная пустота InitializeComponent()
{
компоненты = новый System.ComponentModel.Container();
}
#endregion
#регион пользовательская настройка
Private void ExecuteSql (строка connString, строка DatabaseName, строка sql)
{
SqlConnection conn = новый SqlConnection (connString);
SqlCommand cmd = новый SqlCommand (sql, conn);
конн.Открыть();
cmd.Connection.ChangeDatabase(ИмяБазы);
пытаться
{
cmd.ExecuteNonQuery();
}
поймать (Исключение е)
{
StreamWriter w=new StreamWriter(@"e:\log.txt",true);
w.WriteLine("===in ExecuteSql======");
w.WriteLine(e.ToString());
w.Закрыть();
}
окончательно
{
конн.Закрыть();
}
}
Public переопределить void Install (IDictionary stateSaver)
{
создатьБД();
обновлениеКонфигурация();
}
частная пустота createDB()
{
пытаться
{
string connString=string.Format("server={0};user id={1};пароль={2}",this.Context.Parameters["server"],this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
//Создаем базу данных на основе введенного имени базы данных.
ExecuteSql(connString,"master","create Database "+this.Context.Parameters["dbname"]);
//Вызов osql для выполнения скрипта
string cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql",this.Context.Parameters["server"],this .Context.Parameters["user"],this.Context.Parameters["pwd"],this.Context.Parameters["dbname"],this.Context.Parameters["targetdir"]);
System.Diagnostics.Process sqlProcess=новый процесс();
sqlProcess.StartInfo.FileName="osql.exe";
sqlProcess.StartInfo.Arguments=cmd;
sqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlПроцесс.Начать();
sqlProcess.WaitForExit();//Ожидание выполнения
sqlProcess.Close();
//Удалить файл сценария
System.IO.FileInfo sqlFileInfo=new FileInfo(string.Format("{0}db.sql",this.Context.Parameters["targetdir"]));
если (sqlFileInfo.Exists)
sqlFileInfo.Delete();
}
поймать (Исключение е)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===in Install======");
w.WriteLine(e.ToString());
w.Закрыть();
}
}
частная пустота updateConfig()
{
пытаться
{
//Записываем строку подключения в Web.config
System.IO.FileInfo fileInfo=new FileInfo(string.Format("{0}web.config",this.Context.Parameters["targetdir"]));
if(!fileInfo.Exists)
throw new InstallException("не могу найти файл web.config");
doc=new XmlDocument();
документ.Загрузка(fileInfo.FullName);
bool FoundIt=false;
string connString=string.Format("server={0};database={1};user id={2};пароль={3}",this.Context.Parameters["server"], this.Context.Parameters["dbname"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]);
string enCS=SecurityHelper.EncryptDBConnectionString(connString)
; ("//appSettings/add[@key='connString']");
если (нет! = ноль)
{
no.Attributes.GetNamedItem("значение").Value=enCS;
FoundIt = истина;
}
если(!foundIt)
throw new InstallException("не могу найти настройку connString");
документ.Сохранить(fileInfo.FullName);
}
поймать (Исключение е)
{
StreamWriter w=new StreamWriter(@"e:log.txt",true);
w.WriteLine("===в обновленных данных connstring=tjtj=====");
w.WriteLine(e.ToString());
w.WriteLine(e.StackTrace);
w.Закрыть();
}
}
#конечныйрегион
}
}