Создание Windows-приложений на основе Visual C#

         

Использование данных, получаемых при установке


При установке некоторых программ требуется определять не только каталог установки, но и другие параметры, необходимые для работы приложения. Рассмотрим использование данных пользователя для пакета, устанавливающего базу данных1). Создайте новую библиотеку (тип проекта — Visual C# Projects, шаблон — Class Library) и назовите ее InstallerClass. В окне Solution Explorer щелкаем правой кнопкой на названии проекта и выбираем пункт меню Add New Item. В появившемся окне выбираем шаблон Installer Class и называем его CustomActionDB (рис. 9.56).


Рис. 9.56.  Добавление шаблона Installer Class

Удаляем из проекта Class1.cs. В окне Server Explorer на заголовке Data Connection щелкаем правой кнопкой мыши и выбираем пункт Add Connection. В открывшемся окне на вкладке "Подключение" выбираем или вводим название SQL-сервера (для подключения к локальному серверу вводим "(local)"), выбираем для входа в сеть учетные сведения Windows NT, а в выпадающем списке названий баз данных выбираем или вводим master. Завершив настройку соединения, проверяем подключение и нажимаем OK. В окне Solution Explorer щелкаем правой кнопкой на классе CustomActionDB и выбираем View Designer. Из окна Toolbox добавляем объект SqlConnection и в свойстве ConnectionString указываем только что созданное подключение. В окне Solution Explorer щелкаем правой кнопкой на названии проекта и добавляем к нему TextFile, который называем sqlScript.txt (рис. 9.57).


Рис. 9.57.  Добавленный текстовый файл sqlScript.txt

В этом текстовом файле вводим SQL-запрос на создание таблицы:

CREATE TABLE [dbo].[Employees] ( [Name] [char] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Rsvp] [int] NULL , [Requests] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY];

ALTER TABLE [dbo].[Employees] WITH NOCHECK ADD CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED ( [Name] ) ON [PRIMARY];

В окне Properties файла sqlScript.txt устанавливаем значение свойства Build Action на Embedded Resource (рис. 9.58):


Рис. 9.58.  Свойство Build Action для файла sqlScript.txt

Добавляем в класс CustomActionDB код, считывающий текстовый файл:


При установке некоторых программ требуется определять не только каталог установки, но и другие параметры, необходимые для работы приложения. Рассмотрим использование данных пользователя для пакета, устанавливающего базу данных7). Создайте новую библиотеку (тип проекта — Visual C# Projects, шаблон — Class Library) и назовите ее InstallerClass. В окне Solution Explorer щелкаем правой кнопкой на названии проекта и выбираем пункт меню Add New Item. В появившемся окне выбираем шаблон Installer Class и называем его CustomActionDB (рис. 9.56).


Рис. 9.56.  Добавление шаблона Installer Class

Удаляем из проекта Class1.cs. В окне Server Explorer на заголовке Data Connection щелкаем правой кнопкой мыши и выбираем пункт Add Connection. В открывшемся окне на вкладке "Подключение" выбираем или вводим название SQL-сервера (для подключения к локальному серверу вводим "(local)"), выбираем для входа в сеть учетные сведения Windows NT, а в выпадающем списке названий баз данных выбираем или вводим master. Завершив настройку соединения, проверяем подключение и нажимаем OK. В окне Solution Explorer щелкаем правой кнопкой на классе CustomActionDB и выбираем View Designer. Из окна Toolbox добавляем объект SqlConnection и в свойстве ConnectionString указываем только что созданное подключение. В окне Solution Explorer щелкаем правой кнопкой на названии проекта и добавляем к нему TextFile, который называем sqlScript.txt (рис. 9.57).


Рис. 9.57.  Добавленный текстовый файл sqlScript.txt

В этом текстовом файле вводим SQL-запрос на создание таблицы:

CREATE TABLE [dbo].[Employees] ( [Name] [char] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Rsvp] [int] NULL , [Requests] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY];

ALTER TABLE [dbo].[Employees] WITH NOCHECK ADD CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED ( [Name] ) ON [PRIMARY];

В окне Properties файла sqlScript.txt устанавливаем значение свойства Build Action на Embedded Resource (рис. 9.58):


Рис. 9.58.  Свойство Build Action для файла sqlScript.txt

Добавляем в класс CustomActionDB код, считывающий текстовый файл:




Листинг 9.1.

(html, txt)

Компилируем библиотеку. При этом возникает исключение — класс библиотеки не содержит ссылки на пространство имен Windows:

The type or namespace name 'Windows' does not exist in the class or namespace 'System' (are you missing an assembly reference?)

Для добавления ссылки на это пространство имен щелкаем правой кнопкой мыши на папке References в окне Solution Explorer и выбираем пункт Add References…(рис.рис. 9.59).


Рис. 9.59.  Добавление ссылки на пространство имен

В появившемся списке выбираем пространство имен System.Windows.Forms и добавляем его. Снова компилируем приложение. В окне Solution Explorer щелкаем правой кнопкой на заголовке Solution ‘Installer Class’(1 project) и выбираем Add\New Project. В появившемся окне добавляем проект установки (тип проекта — Setup And Deployment Projects, шаблон – Setup Project) и называем его CustomActionSetup.


/// <summary> /// Считывание текста из файла. /// </summary> /// <param name="name">Название файла.</param> /// <returns></returns> private string GetSql(string name) { try { // Получаем текущий объект класса Assembly System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); // Получаем объект класса Stream к ресурсам текущей сборки. System.IO.Stream str = asm.GetManifestResourceStream(asm.GetName().Name + "." + name); // Считываем и возвращаем содержимое. System.IO.StreamReader reader = new System.IO.StreamReader(str); return reader.ReadToEnd(); } catch(Exception ex) { // Отлавливаем возникшие исключения. System.Windows.Forms.MessageBox.Show("В методе GetSql возникла ошибка: "+ex.Message); throw ex; } } /// <summary> /// Выполнение SQL-запроса. /// </summary> /// <param name="databaseName">Название базы данных.</param> /// <param name="sql">Текст команды.</param> private void ExecuteSql(string databaseName, string sql) { // Создаем объект класса SqlCommand. System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand(sql, sqlConnection1); // Открываем соединение. comm.Connection.Open(); // Изменяем используемую базу данных. comm.Connection.ChangeDatabase(databaseName); try { // Выполняем команду. comm.ExecuteNonQuery(); } finally { // Закрываем соединение. comm.Connection.Close(); } } /// <summary> /// Создание таблицы в базе данных. /// </summary> /// <param name="databaseName">Название базы данных.</param> protected void AddDBTable(string databaseName) { try { // Создаем новую базу данных. this.ExecuteSql("master", "CREATE DATABASE " + databaseName); // Создаем таблицу в новой базе данных. this.ExecuteSql(databaseName, this.GetSql("sqlScript.txt")); } catch(Exception ex) { System.Windows.Forms.MessageBox.Show("В методе AddDBTable возникла ошибка: "+ex.Message); } } /// <summary> /// Перегружаем метод Install /// </summary> /// <param name="stateSaver">Параметр по умолчанию.</param> public override void Install(IDictionary stateSaver) { base.Install (stateSaver); // В качестве названия БД передаем введенное значение пользователем. this.AddDBTable(this.Context.Parameters["dbname"]); }



Листинг 9.1.

Компилируем библиотеку. При этом возникает исключение — класс библиотеки не содержит ссылки на пространство имен Windows:

The type or namespace name 'Windows' does not exist in the class or namespace 'System' (are you missing an assembly reference?)

Для добавления ссылки на это пространство имен щелкаем правой кнопкой мыши на папке References в окне Solution Explorer и выбираем пункт Add References…(рис.рис. 9.59).


Рис. 9.59.  Добавление ссылки на пространство имен

В появившемся списке выбираем пространство имен System.Windows.Forms и добавляем его. Снова компилируем приложение. В окне Solution Explorer щелкаем правой кнопкой на заголовке Solution ‘Installer Class’(1 project) и выбираем Add\New Project. В появившемся окне добавляем проект установки (тип проекта — Setup And Deployment Projects, шаблон – Setup Project) и называем его CustomActionSetup.

Открываем меню изменения пользовательского интерфейса. Добавьте в раздел Start новое диалоговое окно Textboxes (A) и нажмите ОК (рис. 9.60).


Рис. 9.60.  Добавление диалогового окна

Размещаем добавленное окно под диалоговым окном Installation Folder (рис. 9.61).


Рис. 9.61.  Расположение добавленного окна

Устанавливаем следующие свойства окна:

Banner TextAdd the data base nameУкажите имя базы данных.
Body TextWe need this data to create the Data base, that used by our programЭти данные необходимы для создания новой базы данных приложения на вашем сервере баз данных
Edit1LabelData Base NameНазвание базы данных
Edit1PropertyCUSTOMTEXTA1Текст, вводимый пользователем


Свойствам Edit2Visible, Edit3Visible и Edit4Visible устанавливаем значение false.

В окне Solution Explorer нажимаем на кнопку Custom Actions Editor. В открывшемся окне выделяем папку Install и в контекстном меню выбираем Add Custom Action (рис. 9.62):


Рис. 9.62.  Добавление Custom Action

В окне Select Item in Project в папке Application Folder нажимаем на кнопку Add Output. В Add Project output Group выбираем элемент Primary output и нажимаем OK (рис. 9.63).


Рис. 9.63.  Выбор Custom Action

Свойству CustomActionData созданного элемента Primary Output from InstallerClass (Active) устанавливаем значение /dbname=[CUSTOMTEXTA1] (рис. 9.64).


Рис. 9.64.  Изменение свойств CustomActionData

В результате у нас получилось приложение, состоящее из двух проектов. В окне Solution Explorer щелкаем правой кнопкой на названии проекта InstallerClass и выбираем пункт меню Build. Проделываем то же самое для проекта CustomActionSetup. В папке CustomActionSetup\Release появились файлы установки, запускаем Setup.exe. В процессе установки появляется окно для введения названия новой базы данных (рис. 9.65).


Рис. 9.65.  Определение названия создаваемой базы данных

После установки приложения появится новая база данных SQL — в этом можно будет убедиться, запустив программу Enterprise Manager из группы Microsoft SQL Server в меню "Пуск". В рассмотренном примере использовалась локальная база данных — для установки БД на компьютере пользователя необходимо указать сервер базы данных с помощью пользовательского интерфейса проекта.

На диске, прилагаемом к книге, вы найдете проекты InstallerClass и CustomActionSetup (Code\Glava9\ InstallerClass и CustomActionSetup).


Содержание раздела